Android AppTileService onClick未被调用

时间:2017-05-27 14:08:00

标签: android android-service android-7.0-nougat android-7.1-nougat

对于我的Android应用程序,我添加了一个AppTile。大多数情况下,此AppTile 无法点击。其图标显示为灰色,例如已禁用或不可用的图标(https://developer.android.com/reference/android/service/quicksettings/Tile.html#STATE_UNAVAILABLE

在我的日志中,此行永远不会到达

Logger.d(getClass(), "onClick()");

但我已经测试过每次AppTile可见或隐藏时都会调用 onStartListening() onStopListening()方法。

AppTileService.java

package my.package

import android.os.Build;
import android.service.quicksettings.TileService;
import android.support.annotation.RequiresApi;

import my.package.utils.Logger;

@RequiresApi(api = Build.VERSION_CODES.N)
public class AppTileService extends TileService {

    @Override
    public void onClick() {
        Logger.d(getClass(), "onClick()");
        if (isSecure()) {
            Logger.d(getClass(), "isSecure = true");
            NotificationHandler.showDirectReplyNotification(this);
        }
    }
}

的AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="my.package"> 
   <application
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="stateHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <service
            android:name=".AppTileService"
            android:icon="@drawable/tile_icon"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
            <intent-filter>
                <action android:name="android.service.quicksettings.action.QS_TILE"/>
            </intent-filter>
        </service>

    </application>
</manifest>

有人可以告诉我这可能是什么,或者我是否忘记了要实施的内容?

2 个答案:

答案 0 :(得分:1)

您需要以两种方式之一指示磁贴处于活动状态。

首先,您的<service>可能有<meta-data android:name="android.service.quicksettings.ACTIVE_TILE" android:value="true" />

其次,在onStartListening()中,您可以通过this sample app this book中的updateTile()方法更新磁贴状态,使其处于活动状态。

  private void updateTile() {
    Tile tile=getQsTile();

    if (tile!=null) {
      boolean isEnabled=
        getPrefs()
          .getBoolean(SettingsFragment.PREF_ENABLED, false);
      int state=isEnabled ?
        Tile.STATE_ACTIVE :
        Tile.STATE_INACTIVE;

      tile.setIcon(Icon.createWithResource(this,
        R.drawable.ic_new_releases_24dp));
      tile.setLabel(getString(R.string.app_name_short));
      tile.setState(state);
      tile.updateTile();
    }
  }

答案 1 :(得分:0)

我想补充一点,尽管标记为解决方案的答案是 a 正确的解决方案,但它不适合问题的情况,也不能真正解决所描述的问题。

Android documentation statesACTIVE_TILE元数据仅适用于应处理其自定义侦听器生命周期的TileService,如果您希望Tile在打开快速设置抽屉时开始侦听,则不适用。 >

相反,该解决方案需要:

1) Tile的默认状态为STATE_UNAVAILABLE(值0x00),与活动和非活动状态不同,它不响应点击事件。相反,在onTileAdded()和/或onStartListening()中,您应使用以下命令将图块状态更新为有效或无效:

 Tile tile = getQsTile();
 tile.setState(Tile.STATE_ACTIVE);
 tile.updateTile();

2) super.onClick();应该包含在您的onClick()实现中。

我犯了这个错误,并对为什么我的图块不一致地响应水龙头感到困惑。但是在跟踪onStartListening()onStopListening()的调用时间之后,如果您只是希望Tile在用户点击后运行任务,则不应使用上述meta标签。在未实现requestListeningState()的情况下使用它会导致一些奇怪的行为,例如Tile无法正确监听用户的点击。