NotificationListenerService使用方式
1.檢測應(yīng)用是否開啟Notification access監(jiān)聽功能
private boolean isEnabled() { String pkgName = getPackageName(); final String flat = Settings.Secure.getString(getContentResolver(), ENABLED_NOTIFICATION_LISTENERS); if (!TextUtils.isEmpty(flat)) { final String[] names = flat.split(":"); for (int i = 0; i < names.length; i++) { final ComponentName cn = ComponentName.unflattenFromString(names[i]); if (cn != null) { if (TextUtils.equals(pkgName, cn.getPackageName())) { return true; } } } } return false; }
2.如果沒有開啟,開啟Notification access監(jiān)聽功能
Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
startActivity(intent);
3.寫一個(gè)類繼承NotificationListenerService,并重寫兩個(gè)方法
@Override
public void onNotificationPosted(StatusBarNotification sbn, RankingMap rankingMap) {
Log.e("AAA", "=2==onNotificationPosted ID :"
+ sbn.getId() + "\t"
+ sbn.getNotification().tickerText + "\t"
+ sbn.getPackageName());
}
@Override
public void onNotificationRemoved(StatusBarNotification sbn, RankingMap rankingMap) {
Log.e("AAA", "=4==onNotificationRemoved ID :"
+ sbn.getId() + "\t"
+ sbn.getNotification().tickerText
+ "\t" + sbn.getPackageName());
}
4.注冊(cè)服務(wù)和權(quán)限
<service android:name=".NotifyService"
android:label="@string/app_name"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE"
</service>
第一大坑:
以上代碼第一次運(yùn)行可獲得通知欄消息內(nèi)容,但程序殺死后,再次啟動(dòng),不能獲得通知消息內(nèi)容。
究其原因,看圖說話:使用adb命令adb shell dumpsys notification,得到 All notification listeners(下圖紅線)和Live notification listeners(下圖藍(lán)線).我第一次啟動(dòng),All notification listeners為3,Live notification listeners為2;第二次啟動(dòng),All notification listeners為3,Live notification listeners為1,說明雖然我們Notification access監(jiān)聽功能依然開啟,但監(jiān)聽的服務(wù)卻是die.所以這就是再次啟動(dòng)程序,無反應(yīng)的原因。
_IC%CWF2{LX]QY9EN.png](http://upload-images.jianshu.io/upload_images/2326838-7f046e72e1a9dfb2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
)
解決辦法:把應(yīng)用的NotificationListenerService實(shí)現(xiàn)類disable再enable,即可觸發(fā)系統(tǒng)rebind操作。
private void toggleNotificationListenerService() {
PackageManager pm = getPackageManager();
pm.setComponentEnabledSetting(
new ComponentName(this, com.notify.NotifyService.class),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
pm.setComponentEnabledSetting(
new ComponentName(this, com.notify.NotifyService.class),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
}
后記:曾經(jīng)嘗試在自定義的service類里面,使用onbind方法,進(jìn)行綁定服務(wù),經(jīng)驗(yàn)證無效。還有一大坑莫過于,用AS工具創(chuàng)建service,改成extends NotificationListenerService,改變服務(wù)及權(quán)限,經(jīng)測試,依然無效。
這個(gè)問題長時(shí)間郁結(jié)我心,今日得破,甚是暢快。從accessibility---安卓的輔助功能,到今天的NotificationListenerService,曲折苦澀,個(gè)中滋味難以言表。多謝前輩們的指導(dǎo),推薦:https://my.oschina.net/tingzi/blog/413666,教我使用NotificationListenerService;https://www.zhihu.com/question/33540416,幫我解決一個(gè)大坑。