对于我的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>
有人可以告诉我这可能是什么,或者我是否忘记了要实施的内容?
答案 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 states,ACTIVE_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无法正确监听用户的点击。