日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NotificationListenerService不能监听到通知

發布時間:2024/1/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NotificationListenerService不能监听到通知 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
作者:Hugo
鏈接:https://www.zhihu.com/question/33540416/answer/113706620
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。

背景知識:

所屬:android.service.notification.NotificationListenerService

作用:監聽通知欄內容變化的服務

  • extends Service,abstract class(意味著第三方可以實現去接收通知欄的通知數據)。
  • Added in API level 18(Android 4.3)。
  • 應用場景:智能手表(Google官方的Android Wear手機端App,通知消息同步到手表。如下圖)、紅包助手(監聽通知欄的微信紅包消息)等。
  • Service bind時機:在系統的設置通知授權中勾選并授權時。
  • 回調時機:有新通知或通知被移除或通知排序變化時系統回調。

  • ----坑------

    應用進程被殺后再次啟動時,服務不生效(沒有bindService)(在下圖所示的藍色列表名單中,不在紅色的存活名單中)。

    影響:通知欄有內容變更,服務無法感知。

    還原方法:重啟手機

    必現手機(方便調試):小米Note Pro,清除后臺應用后。

    我們要做的:讓服務重生。

    調試手段:查看存活的通知監聽服務。

    方法:adb shell dumpsys notification


    藍色:已授權的通知監聽Service列表。

    紅色:當前存活的的通知監聽Service列表。


    調查思路:
    一、第三方應用主動注冊
    二、觸發系統重新bind

    思路一:第三方應用主動注冊

    關鍵代碼路徑:

    • android.service.notification.NotificationListenerService#registerAsSystemService
    • android.app.INotificationManager.Stub#enforceSystemOrSystemUI

    條件:

    • 系統的uid或有android.permission.STATUS_BAR_SERVICE權限。

    ∴ 路不通。


    思路二:觸發系統重新bind

    關鍵代碼路徑:

    • com.android.server.notification.ManagedServices#rebindServices

    三種方式觸發:

  • A && B(A:應用安裝卸載或更新等的廣播;B:上圖藍色列表中的服務有變化)。
  • 系統的登錄用戶切換 。[pass]
  • Settings.Secure.ENABLED_NOTIFICATION_LISTENERS的Settings值有變更。
  • 第三方有權利觸發的方式(源碼分析得知 1B= 3):

    • Service的disable,會有Intent.ACTION_PACKAGE_CHANGED廣播,并且從上圖藍色列表中移除。

    利用這一特性,把應用的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); }

    問題解決。


    補充:

    1、怎樣在代碼中判斷自己的服務是否在上圖藍色列表(通知已授權)中?


    private static boolean isNotificationListenerServiceEnabled(Context context) {Set<String> packageNames = NotificationManagerCompat.getEnabledListenerPackages(context);if (packageNames.contains(context.getPackageName())) {return true;}return false;}
    2、怎樣發起通知授權流程。


    startActivity(new Intent(NotificationConstants.ACTION_NOTIFICATION_LISTENER_SETTINGS));

    總結

    以上是生活随笔為你收集整理的NotificationListenerService不能监听到通知的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。