最近和一个做手环的公司对接,封装了一堆蓝牙的接口,然后那些消息的监听什么的不给,只能自己去实现。
不得不说非常幸运,NotificationListenerService正好是API 18开始加入的,而蓝牙BLE最低支持的就是18。
根据API的描述,我们发现只需要两步就能实现通知的监听:
1、实现Service
创建一个实现NotificationListenerService的服务,如果只是监听通知的显示和取消只需要在服务里重写通知显示监听onNotificationPosted和通知移除onNotificationRemoved即可。
- /**
- * 通知监听服务
- *
- * @author SJL
- * @date 2017/5/22 22:21
- */
- public class NLService extends NotificationListenerService {
- @Override
- public void onNotificationPosted(StatusBarNotification sbn) {
- super.onNotificationPosted(sbn);
- }
- @Override
- public void onNotificationRemoved(StatusBarNotification sbn) {
- super.onNotificationRemoved(sbn);
- }
- }
2、配置Manifest
在我们创建Service的时候,Manifest中已经有service节点的配置生成了,我们只需要配置一下权限和过滤器即可,非常方便。
- <service
- android:name=“.NLService”
- android:permission=“android.permission.BIND_NOTIFICATION_LISTENER_SERVICE”>
- <intent-filter>
- <action android:name=“android.service.notification.NotificationListenerService” />
- </intent-filter>
- </service>
3、权限问题
只需要以上两步就能实现通知消息的监听确实很方便,但谷歌仍给我们留了个坑——权限问题。
与之前的悬浮窗问题一样,监听通知栏的消息也需要用户手动去授权。
判断是否已授权,使用了v7兼容库中方法,超方便
- /**
- * 是否已授权
- *
- * @return
- */
- private boolean isNotificationServiceEnable() {
- return NotificationManagerCompat.getEnabledListenerPackages(this).contains(getPackageName());
- }
跳转通知授权界面
- startActivity(new Intent(“android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS”));