通知監(jiān)控NotificationListenerService onNotificationPosted重復(fù)回調(diào)問題
正文
通過 NotificationListenerService 監(jiān)聽第三方應(yīng)用的通知發(fā)現(xiàn),同一條通知,會回調(diào)兩次 onNotificationPosted 方法。
// 第一次回調(diào) 2023-01-31 11:42:31.082330 2483 2483 I NotificationMonitorService: onNotificationPosted:StatusBarNotification(pkg=com.tencent.wemeet.app user=UserHandle{0} id=11499522 tag=null key=0|com.tencent.wemeet.app|11499522|null|10076: Notification(channel=wemeet shortcut=null contentView=null vibrate=default sound=android.resource://com.tencent.wemeet.app/2131623938 tick defaults=0x6 flags=0x11 color=0x00000000 vis=PRIVATE)) - 1 2023-01-31 11:42:31.086442 2483 2483 I NotificationMonitorReceiver: notify time: 1675136670845, pending size: 1 // 第二次回調(diào) 2023-01-31 11:42:31.088771 2483 2483 I NotificationMonitorService: onNotificationPosted:StatusBarNotification(pkg=com.tencent.wemeet.app user=UserHandle{0} id=11499522 tag=null key=0|com.tencent.wemeet.app|11499522|null|10076: Notification(channel=wemeet shortcut=null contentView=null vibrate=default sound=android.resource://com.tencent.wemeet.app/2131623938 tick defaults=0x6 flags=0x11 color=0x00000000 vis=PRIVATE)) - 1 2023-01-31 11:42:31.090506 2483 2483 I NotificationMonitorReceiver: notify time: 1675136670845, pending size: 2
解決該問題的思路是如何判斷兩次回調(diào)的 StatusBarNotification 對象是同一個通知。
經(jīng)過日志分析,onNotificationPosted 的時間戳相差毫秒級別,且兩次 StatusBarNotification 對象的 postTime 是相同的。
通過記錄上一次 StatusBarNotification 對象,并與第二次的 StatusBarNotification 對象進行比較去重,
StatusBarNotification 對象有個屬性 key,可以作為唯一識別符:
private String key() { String sbnKey = user.getIdentifier() + "|" + pkg + "|" + id + "|" + tag + "|" + uid; if (overrideGroupKey != null && getNotification().isGroupSummary()) { sbnKey = sbnKey + "|" + overrideGroupKey; } return sbnKey; }
并配合 postTime 屬性進行去重:
// 過濾同一條通知 if (lastSbn?.key == sbn.key && lastSbn?.postTime == sbn.postTime) { return }
當然,如果你知道一些 Intent 中的額外信息,也可以作為過濾條件:
val text = extras.getString(Notification.EXTRA_TEXT) val title = extras.getString(Notification.EXTRA_TITLE) // other ...
以上就是通知監(jiān)控NotificationListenerService onNotificationPosted重復(fù)回調(diào)問題的詳細內(nèi)容,更多關(guān)于NotificationListenerService onNotificationPosted的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android PC端用ADB抓取指定應(yīng)用日志實現(xiàn)步驟
這篇文章主要介紹了Android PC端用ADB抓取指定應(yīng)用日志實現(xiàn)步驟,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04Android中用Bmob實現(xiàn)短信驗證碼功能的方法詳解
本文給大家分享通過第三方平臺Bmob實現(xiàn)發(fā)送驗證碼和校驗驗證碼的功能,非常不錯,具有參考借鑒價值,感興趣的朋友一起看看吧2016-09-09Android仿今日頭條多個fragment懶加載的實現(xiàn)
我們在做應(yīng)用開發(fā)的時候,一個Activity里面可能會以viewpager(或其他容器)與多個Fragment來組合使用,下面這篇文章主要給大家介紹了關(guān)于利用Android仿今日頭條多個fragment懶加載的相關(guān)資料,需要的朋友可以參考下。2017-12-12Android編程開發(fā)之多點觸摸(Multitouch)實現(xiàn)方法
這篇文章主要介紹了Android編程開發(fā)之多點觸摸(Multitouch)實現(xiàn)方法,結(jié)合實例形式詳細分析了Android多點觸摸的相關(guān)實現(xiàn)步驟與操作技巧,需要的朋友可以參考下2016-08-08Android開發(fā)使用UncaughtExceptionHandler捕獲全局異常
本文主要介紹在Android開發(fā)中使用UncaughtExceptionHandler捕獲全局異常,需要的朋友可以參考下。2016-06-06Android編程實現(xiàn)將壓縮數(shù)據(jù)庫文件拷貝到安裝目錄的方法
這篇文章主要介紹了Android編程實現(xiàn)將壓縮數(shù)據(jù)庫文件拷貝到安裝目錄的方法,涉及Android處理壓縮文件的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10