您的位置:首页 > 其它

360卫士通知盒子和红包助手的实现原理(NotificationListenerService)

2016-06-07 16:53 274 查看
Google在Android 4.3 (API 18)中引入一个新类NotificationListenerService,它的功能很强大,当任何应用弹出通知的时候,它都可以接收到,并且当通知被移除的时候,它也可以接收到信息,很显然,我们可以通过这个类来对手机中的通知进行管理,360通知盒子和红包助手就是这样实现的,红包助手主要就是通过得到通知栏的通知来查看是否为红包的提示通知,如果是就提示红包来了。

现在大致说说用法吧!

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

精品内容独家发布平台





呈现与博客不一样的技术干货
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: