Android AppTileService onClick 未被调用

Android AppTileService onClick not get called

对于我的 android 应用程序,我添加了一个 AppTile。大部分时间此 AppTile 不可点击。它的图标是灰色的,例如禁用或不可用的图标(https://developer.android.com/reference/android/service/quicksettings/Tile.html#STATE_UNAVAILABLE)

在我的日志中从未到达过这一行

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

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

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>

谁能告诉我这可能是什么,或者我是否忘记了要实现的东西?

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

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

其次,在onStartListening()中,您可以将磁贴状态更新为活动状态,就像我在this sample app from 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();
    }
  }

我想补充一点,虽然标记为解决方案的答案是一个正确的解决方案,但它不符合问题的情况,并没有真正解决所描述的问题.

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

相反,解决方案需要:

1) Tile的默认状态是STATE_UNAVAILABLE(值0x00),不像active和inactive状态那样不响应点击事件.相反,在 onTileAdded() and/or onStartListening() 中,您应该使用以下方式将磁贴状态更新为活动或非活动:

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

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

我犯了这个错误,并且很困惑为什么我的 Tile 对点击的响应不一致。但是在跟踪 onStartListening()onStopListening() 被调用后,如果您只是希望 Tile 在用户点击后 运行 执行任务,则不应使用上述元标记。在不实施 requestListeningState() 的情况下使用它会导致一些奇怪的行为,例如 Tile 无法正确监听用户点击。