所屬: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));