NotificationListenerService使用方式
1.检测应用是否开启Notification access监听功能
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监听功能
Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
startActivity(intent);
3.写一个类继承NotificationListenerService,并重写两个方法
@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.注册服务和权限
<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>
第一大坑:
以上代码第一次运行可获得通知栏消息内容,但程序杀死后,再次启动,不能获得通知消息内容。
究其原因,看图说话:使用adb命令adb shell dumpsys notification
,得到 All notification listeners
(下图红线)和Live notification listeners
(下图蓝线).我第一次启动,All notification listeners
为3,Live notification listeners
为2;第二次启动,All notification listeners
为3,Live notification listeners
为1,说明虽然我们Notification access监听功能依然开启,但监听的服务却是die.所以这就是再次启动程序,无反应的原因。
![](
![NYQG0)_IC%CWF2{LX]QY9EN.png](https://img.haomeiwen.com/i2326838/7f046e72e1a9dfb2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
)
解决办法:把应用的NotificationListenerService实现类disable再enable,即可触发系统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);
}
后记:曾经尝试在自定义的service类里面,使用onbind方法,进行绑定服务,经验证无效。还有一大坑莫过于,用AS工具创建service,改成extends NotificationListenerService,改变服务及权限,经测试,依然无效。
这个问题长时间郁结我心,今日得破,甚是畅快。从accessibility---安卓的辅助功能,到今天的NotificationListenerService,曲折苦涩,个中滋味难以言表。多谢前辈们的指导,推荐:https://my.oschina.net/tingzi/blog/413666,教我使用NotificationListenerService;https://www.zhihu.com/question/33540416,帮我解决一个大坑。
网友评论