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 无法正确监听用户点击。
对于我的 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 无法正确监听用户点击。