您的位置:首页 > 移动开发 > Android开发

Android NotificationListenerService的使用

2018-01-15 14:40 567 查看
今天有个项目要使用到监听来电 信息 QQ 微信 等等的通知,所以写个demo。同时也给自己当一个备忘。

一、理解

NotificationListenerService是通过系统调起的服务,在应用发起通知时,系统会将通知的应用,动作和信息回调给NotificationListenerService。

二、使用

在 Android 4.3 以下(API < 18)使用 
AccessibilityService
 来读取新通知,在
Android 4.3 及以上(API >= 18)使用 
NotificationListenerService
 来满足需求。

1,首先创建一个Class 继承自 NotificationListenerService并重写其中两个方法onNotificationPosted和onNotificationRemoved:

public class NotificationCollectorService extends NotificationListenerService{
//来通知时的调用
@Override
public void onNotificationPosted(StatusBarNotification sbn) {
super.onNotificationPosted(sbn);
}

//删除通知时的调用
@Override
public void onNotificationRemoved(StatusBarNotification sbn) {
super.onNotificationRemoved(sbn);
}

}


2,需要在在AndroidManifest.xml中注册Service并声明相关权限:

<service android:name=".NotificationCollectorService"android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
<intent-filter>
<action 		    android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
</service>

3,监测通知监听服务有没有授权,没有授权就打开监听设置页面:

//检测通知监听服务是否被授权
public boolean isNotificationListenerEnabled(Context context) {
Set<String> packageNames = NotificationManagerCompat.getEnabledListenerPackages(this);
if (packageNames.contains(context.getPackageName())) {
return true;
}
return false;
}
//打开通知监听设置页面
public void openNotificationListenSettings() {
try {
Intent intent;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) {
intent = new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS);
} else {
intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
}
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}

完成这三步之后就可以监听到通知了。但还有个坑,APP杀死后再次进入监听不到了。经过度娘后发现这个监听不到的坑的问题是因为 
NotificationListenerService
 被杀后再次启动时,并没有去 
bindService
 ,所以导致监听效果无效。

利用回答中的解决方法,把应用的NotificationListenerService实现类disable再enable,即可触发系统rebind操作:

private void toggleNotificationListenerService() {
PackageManager pm = getPackageManager();
pm.setComponentEnabledSetting(
new ComponentName(this, com.tang.monitor.monitor.NotificationCollectorService.class),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

pm.setComponentEnabledSetting(
new ComponentName(this, com.tang.monitor.monitor.NotificationCollectorService.class),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
}

好了,就写到这里。第一次写博客,排版啥的没搞好,希望能坚持下去。
源码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐