360卫士通知盒子和红包助手的实现原理(NotificationListenerService)
2016-06-07 16:53
274 查看
Google在Android 4.3 (API 18)中引入一个新类NotificationListenerService,它的功能很强大,当任何应用弹出通知的时候,它都可以接收到,并且当通知被移除的时候,它也可以接收到信息,很显然,我们可以通过这个类来对手机中的通知进行管理,360通知盒子和红包助手就是这样实现的,红包助手主要就是通过得到通知栏的通知来查看是否为红包的提示通知,如果是就提示红包来了。
现在大致说说用法吧!
1、创建一个类继承NotificationListenerService,实现它两个非常重要的方法onNotificationPosted和onNotificationRemoved,一个是当有通知到来的时候的回调,一个是通知被移除的时候的回调。
当有通知到来的时候,onNotificationPosted就会调用,参数StatusBarNotification为状态栏通知的具体信息。
当状态栏通知被移除的时候,onNotificationRemoved就会调用,参数StatusBarNotification为状态栏通知的具体信息。
2、在AndroidManifest文件中安装下面声明这个Service
需要注意的是,必须带有BIND_NOTIFICATION_LISTENER_SERVICE权限和一个action为NotificationListenerService的Intent filter。
这样我们就基本可以实现通知的管理了,具体的通知管理自己可以根据需要去实现。
3、运行程序之后,进行权限开启
当我们运行程序之后,在“设置”-> “安全” -> “通知读取权限” 就会出现我们程序对应的通知读取开关,默认是关闭的,所以我们需要进行开启。
我们也可以使用代码检查该权限是否打开:
代码进入“通知读取权限”界面
4、下面我们来说说NotificationListenerService和StatusBarNotification里面有哪些有用的方法。
(2)StatusBarNotification
具体的Demo可以参考https://github.com/kpbird/NotificationListenerService-Example
欢迎关注微信公众号:DroidMind
精品内容独家发布平台
![](https://img-blog.csdn.net/20170619210700424)
呈现与博客不一样的技术干货
现在大致说说用法吧!
1、创建一个类继承NotificationListenerService,实现它两个非常重要的方法onNotificationPosted和onNotificationRemoved,一个是当有通知到来的时候的回调,一个是通知被移除的时候的回调。
public class NLService extends NotificationListenerService { @Override public void onNotificationPosted(StatusBarNotification sbn) { } @Override public void onNotificationRemoved(StatusBarNotification sbn) { } }
当有通知到来的时候,onNotificationPosted就会调用,参数StatusBarNotification为状态栏通知的具体信息。
当状态栏通知被移除的时候,onNotificationRemoved就会调用,参数StatusBarNotification为状态栏通知的具体信息。
2、在AndroidManifest文件中安装下面声明这个Service
<service android:name="com.example.notificationservice.NLService" android:label="@string/app_name" android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"> <intent-filter> <action android:name="android.service.notification.NotificationListenerService" /> </intent-filter> </service>
需要注意的是,必须带有BIND_NOTIFICATION_LISTENER_SERVICE权限和一个action为NotificationListenerService的Intent filter。
这样我们就基本可以实现通知的管理了,具体的通知管理自己可以根据需要去实现。
3、运行程序之后,进行权限开启
当我们运行程序之后,在“设置”-> “安全” -> “通知读取权限” 就会出现我们程序对应的通知读取开关,默认是关闭的,所以我们需要进行开启。
我们也可以使用代码检查该权限是否打开:
boolean isOpenNotificationReadPermission() { String notiStr = Settings.Secure.getString(getContentResolver(), "enabled_notification_listeners"); if (notiStr != null && !TextUtils.isEmpty(notiStr)) { final String[] names = notiStr.split(":"); for (int i = 0; i < names.length; i++) { ComponentName cn = ComponentName.unflattenFromString(names[i]); if (cn != null) { return getPackageName().equals(cn.getPackageName()); } } } return false; }
代码进入“通知读取权限”界面
if (!isOpenNotificationReadPermission()) { Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"); cxt.startActivity(intent); }
4、下面我们来说说NotificationListenerService和StatusBarNotification里面有哪些有用的方法。
删除系统中可被清除的通知; final void cancelAllNotifications() final void cancelNotification(String pkg, String tag, int id) final void cancelNotification(String key) final void cancelNotifications(String[] keys) 得到当前通知栏显示的通知 StatusBarNotification[] getActiveNotifications() StatusBarNotification[] getActiveNotifications(String[] keys) 开始监听回调 onListenerConnected() 通知出现回调 onNotificationPosted(StatusBarNotification sbn, NotificationListenerService.RankingMap rankingMap) onNotificationPosted(StatusBarNotification sbn) 通知移除回调 onNotificationRemoved(StatusBarNotification sbn) onNotificationRemoved(StatusBarNotification sbn, NotificationListenerService.RankingMap rankingMap) 告诉notification manager指定的通知必须被用户看到 final void setNotificationsShown(String[] keys)
(2)StatusBarNotification
返回通知对应的id; int getId() 返回通知对象; Notification getNotification() 返回通知对应的包名; String getPackageName() 返回通知发起的时间; long getPostTime() 返回通知的Tag,如果没有设置返回null; String getTag() boolean isClearable() 返回该通知是否可被清楚,FLAG_ONGOING_EVENT、FLAG_NO_CLEAR; boolean isOngoing() isOngoing():检查该通知的flag是否为FLAG_ONGOING_EVENT;
具体的Demo可以参考https://github.com/kpbird/NotificationListenerService-Example
欢迎关注微信公众号:DroidMind
精品内容独家发布平台
呈现与博客不一样的技术干货
相关文章推荐
- 国内java报表软件简单对比
- Realm学习(二)
- UIScrollView 用法详解
- Linux命令笔记
- 共享linux的ssh终端
- 逐次逼近型ADC
- LeetCode---Remove Duplicate Letters解题分析
- 60个开发者不容错过的免费资源库
- 原子操作
- 获取中国时区时间
- OpenSwitch操作系统成为Linux基金会官方项目
- HDU 2089 不要62
- 字符串匹配之KMP算法推导过程
- LeetCode Reverse Linked List II
- 安装CocoaPods遇到的问题及解决办法
- KMP算法求next数组和nextval数组
- KMP算法求next数组和nextval数组
- 快速掌握AngularJs
- 程序员之路──关于代码风格
- 计算文字适合的宽度!