所属:android.service.notification.NotificationListenerServicejava
做用:监听通知栏内容变化的服务android
影响:通知栏有内容变动,服务没法感知。shell
还原方法:重启手机微信
必现手机(方便调试):小米Note Pro,清除后台应用后。app
咱们要作的:让服务重生。源码分析
调试手段:查看存活的通知监听服务。ui
方法:adb shell dumpsys notificationthis
蓝色:已受权的通知监听Service列表。spa
红色:当前存活的的通知监听Service列表。调试
关键代码路径:
条件:
∴ 路不通。
关键代码路径:
三种方式触发:
第三方有权利触发的方式(源码分析得知 1B= 3):
利用这一特性,把应用的NotificationListenerService实现类disable再enable,便可触发系统rebind操做。
private void toggleNotificationListenerService() { PackageManager pm = getPackageManager(); pm.setComponentEnabledSetting(new ComponentName(this, com.xinghui.notificationlistenerservicedemo.NotificationListenerServiceImpl.class), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); pm.setComponentEnabledSetting(new ComponentName(this, com.xinghui.notificationlistenerservicedemo.NotificationListenerServiceImpl.class), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); }
问题解决。
补充:
一、怎样在代码中判断本身的服务是否在上图蓝色列表(通知已受权)中?
private static boolean isNotificationListenerServiceEnabled(Context context) {
Set<String> packageNames = NotificationManagerCompat.getEnabledListenerPackages(context);
if (packageNames.contains(context.getPackageName())) {
return true;
}
return false;
}
startActivity(new Intent(NotificationConstants.ACTION_NOTIFICATION_LISTENER_SETTINGS));