Android?NotificationListenerService通知監(jiān)聽服務(wù)使用
前言
本篇我們將介紹如何利用NotificationListenerService實現(xiàn)類似智能手表通知同步、微信自動搶紅包等功能。實現(xiàn)這些功能的原理其實就是監(jiān)聽系統(tǒng)的通知服務(wù),接下來我們來看該如何實現(xiàn)。
NotificationListenerService的使用
創(chuàng)建NotificationListenerService
在Android中如果我們想要監(jiān)聽系統(tǒng)的通知,就需要實現(xiàn)一個服務(wù),繼承自NotificationListenerService,新建NotificationMonitorService類,代碼如下所示。
class NotificationMonitorService : NotificationListenerService() {
//收到通知時的回調(diào)
override fun onNotificationPosted(sbn: StatusBarNotification) {
super.onNotificationPosted(sbn)
}
//通知移除時的回調(diào)
override fun onNotificationRemoved(sbn: StatusBarNotification?) {
super.onNotificationRemoved(sbn)
}
}這里我們重寫onNotificationPosted方法和onNotificationRemoved方法,這兩個方法分別會在收到通知和通知被移除時調(diào)用。這里我們著重來看onNotificationPosted方法。
在onNotificationPosted方法中有一個StatusBarNotification實例,通過這個實例我們可以獲取通知消息的包名、內(nèi)容等。代碼如下所示。
class NotificationMonitorService : NotificationListenerService() {
override fun onNotificationPosted(sbn: StatusBarNotification) {
super.onNotificationPosted(sbn)
val extras = sbn.notification.extras
// 獲取接收消息APP的包名
val notificationPkg = sbn.packageName
// 獲取接收消息的抬頭
val notificationTitle = extras.getString(Notification.EXTRA_TITLE)
// 獲取接收消息的內(nèi)容
val notificationText = extras.getString(Notification.EXTRA_TEXT)
Log.d("收到的消息內(nèi)容包名:", notificationPkg)
Log.d("收到的消息內(nèi)容", "Notification posted $notificationTitle & $notificationText")
}
}然后記得在配置文件中添加這個Service的聲明,代碼如下所示。
<service android:name="com.example.myapplication.NotificationMonitorService"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
android:exported="true">
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
</service>創(chuàng)建好NotificationMonitorService之后,接下來我們就可以啟動這個服務(wù)了。
啟動服務(wù)
現(xiàn)在直接啟動服務(wù),肯定是沒辦法監(jiān)聽到系統(tǒng)通知的,在啟動服務(wù)前,我們應(yīng)該授予App監(jiān)聽系統(tǒng)通知的權(quán)限。
在AndroidManifest.xml中添加權(quán)限,代碼如下所示。
<uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"/>
啟動服務(wù)前判斷是否開啟了監(jiān)聽通知的權(quán)限,如果沒有則跳轉(zhuǎn)到設(shè)置頁開啟,代碼如下所示。
if (NotificationManagerCompat.getEnabledListenerPackages(this).contains(packageName)){
val intent = Intent(this,NotificationMonitorService::class.java)
startService(intent)
}else{
startActivity(Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"))
}如果沒有開啟,跳轉(zhuǎn)到的設(shè)置頁如下所示。


開啟了監(jiān)聽通知權(quán)限,運行程序,打印日志如下所示。

對應(yīng)的打印日志是,收到了來自微信的群聊消息,發(fā)了一個“強”。
當(dāng)收到短信、來電等消息時,系統(tǒng)同樣會發(fā)送一個通知,我們可以根據(jù)收到的通知處理不同的業(yè)務(wù)。這里感興趣的讀者可自行嘗試。接著我們來模擬實現(xiàn)自動搶紅包的功能。
實現(xiàn)自動搶紅包功能
這里為了測試,歷盡千辛萬苦讓我老婆給我發(fā)了一個0.01的紅包,我們監(jiān)聽到的內(nèi)容為“[微信紅包]恭喜發(fā)財,大吉大利”。如下圖所示。

所以我們可以在收到消息時,通過監(jiān)聽微信包名、以及消息內(nèi)容來判斷是否收到了微信紅包來處理具體的操作。(不處理,別人故意發(fā)同樣的文字)。
if (notificationPkg.equals("com.tencent.mm")){
if (notificationText.equals("[微信紅包]恭喜發(fā)財,大吉大利")){
//收到微信紅包了
}
}這樣我們只需要在代碼處處理接下來的操作就可以了。其實我們的操作也很簡單,只需要在監(jiān)聽到有紅包時打開對應(yīng)的微信頁面即可,代碼如下所示。
class NotificationMonitorService : NotificationListenerService() {
override fun onNotificationPosted(sbn: StatusBarNotification) {
super.onNotificationPosted(sbn)
val extras = sbn.notification.extras
// 獲取接收消息APP的包名
val notificationPkg = sbn.packageName
// 獲取接收消息的內(nèi)容
val notificationText = extras.getString(Notification.EXTRA_TEXT)
if (notificationPkg.equals("com.tencent.mm")){
if (notificationText.equals("[微信紅包]恭喜發(fā)財,大吉大利")){
//收到微信紅包了
val intent = sbn.notification.contentIntent
intent.send()
}
}
}
}這里我們直接通過sbn拿到notification的intent,進(jìn)行intent.send操作即可,運行程序,收到紅包后,頁面將自動跳轉(zhuǎn)到微信紅包頁面,結(jié)果如下圖所示。

最后
利用通知監(jiān)聽服務(wù)這一功能,我們可以實現(xiàn)許多諸如 智能手表的消息同步、微信搶紅包等功能,如果你有需要,也可以讓你女朋友的消息立即彈出,這樣就再也不用跪搓衣板啦~
以上就是Android NotificationListenerService通知監(jiān)聽服務(wù)使用的詳細(xì)內(nèi)容,更多關(guān)于Android NotificationListenerService的資料請關(guān)注腳本之家其它相關(guān)文章!
- Android入門之Service的使用詳解
- Android Google AutoService框架使用詳解
- Android使用Service實現(xiàn)IPC通信的2種方式
- 說說在Android如何使用服務(wù)(Service)的方法
- Android使用Service實現(xiàn)簡單音樂播放實例
- 淺談Android中Service的注冊方式及使用
- Android編程使用Service實現(xiàn)Notification定時發(fā)送功能示例
- Android 通知使用權(quán)(NotificationListenerService)的使用
- Android Service功能使用示例代碼
相關(guān)文章
Kotlin 封裝萬能SharedPreferences存取任何類型詳解
這篇文章主要介紹了Kotlin 封裝萬能SharedPreferences存取任何類型詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05
Android?利用ImageView屬性實現(xiàn)選中和未選中效果
這篇文章主要介紹了Android巧用ImageView屬性實現(xiàn)選中和未選中效果,實現(xiàn)思路通常我們會選擇在布局里加個ImageView,然后通過代碼層面加個判斷去讓ImageView加載不同狀態(tài)的圖片,需要的朋友可以參考下2023-06-06
Android控件Chronometer定時器的實現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了Android控件Chronometer定時器的實現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11
Android編程設(shè)計模式之狀態(tài)模式詳解
這篇文章主要介紹了Android編程設(shè)計模式之狀態(tài)模式,結(jié)合實例形式詳細(xì)分析了Android狀態(tài)模式的概念、功能、使用方法及相關(guān)注意事項,需要的朋友可以參考下2017-12-12
Android框架Volley使用:ImageRequest請求實現(xiàn)圖片加載
這篇文章主要介紹了Android框架Volley使用:ImageRequest請求實現(xiàn)圖片加載的相關(guān)知識,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-05-05

