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