需求背景
由于公司是做蓝牙可穿戴设备的,其中有一个向设备推送第三方的推送消息的功能。
主要API
NotificationLisenerService:android提供获取通知的服务
主要代码
继承NotificationLisenerService 并重写onNotificationPosted(StatusBarNotification sbn)方法与onNotificationRemoved(StatusBarNotification sbn)方法。
onNotificationPosted(StatusBarNotification sbn)是在通知栏有新通知到来时调用
@Override public void onNotificationPosted(StatusBarNotification sbn) {
Bundle extras = sbn.getNotification().extras; //获取bundle对象 String nameFun1 = extras.getString(Notification.EXTRA_TITLE); //获取通知的标题 CharSequence charSequence = extras.getCharSequence(Notification.EXTRA_TEXT); // 获取通知的内容}
此时新来的新通知信息保存在sbn对象中,对于WeChat,QQ等一些通知是可以获取到信息的。但是对于Whatsapp,由于
whatsapp的推送是采用堆叠的通知方式,只能获取到最后面的一条,导致多人聊天时只能获取到第一个聊天对象的最后一条数据。
经过认真的研究发现NotificationLisenerService内置一个方法getActivityNotifications();顾名思义是得到所有活动在通知栏的通知信息
StatusBarNotification[] statusBarNotifications = getActiveNotifications(); //这个方法是得到一个StatusBarNotification的数组,就是所有的活动通知
然后尝试在onNotificationPosted(StatusBarNotification sbn)中增加此方法,发现能够获取通知栏的所有信息但是不包括最新的一条,个人猜测是先获取通知然后在将通知放入通知的容器中,此时容器中还没有最新的数据。心中有所猜测后就决定尝试,延时获取在onNotificationPosted(StatusBarNotification sbn)方法中加入
new Handler().postDelayed(new Runnable() { @Override public void run() { StringBuffer contents = new StringBuffer(); try{ StatusBarNotification[] statusBarNotifications = getActiveNotifications(); for(StatusBarNotification statusBarNotification : statusBarNotifications) { Bundle extras2 = statusBarNotification.getNotification().extras;
CharSequence title = extras2.getCharSequence(Notification.EXTRA_TITLE); CharSequence text = extras2.getCharSequence(Notification.EXTRA_TEXT); if (title != null) { Log.e(TAG, ">>>>>收到通知6:" + title.toString()); contents.append(title.toString()); } if (text != null) { Log.e(TAG, ">>>>>收到通知7:" + text.toString()); contents.append(text.toString()); contents.append(";"); }
}} catch (Exception e) { e.printStackTrace() ; } }} , 1000) ; 此时打印出来能看到whatsapp的最新消息。
onNotificationRemoved(StatusBarNotification sbn)是在通知栏通知被移除时调用
@Override public void onNotificationRemoved(StatusBarNotification sbn) { super.onNotificationRemoved(sbn); }
小结:
当碰到困难时,多看看API还给开发者提供了哪些可用的方法可以调用。
由于只是写针对性的问题,获取使用通知权限的一些过程就不写了。