Android通知栏试谈

来源:互联网 发布:泊众棋牌五星红辉源码 编辑:程序博客网 时间:2024/05/21 06:24

最先引起我注意的是如下图的情形,从上到下分别是蜻蜓FM,QQ音乐,虾米音乐,网易云音乐,网易云消息,QQ消息,酷我听书。那么问题来了,像QQ音乐、虾米音乐这种具有超强实力的软件,排序竟然在蜻蜓FM之后,这是为什么?
这里写图片描述

同样在通知栏,它们的排序规则是什么?在研究这个问题之前,先来简单了解一下通知。

创建通知

您可以在 NotificationCompat.Builder 对象中为通知指定 UI 信息和操作。要创建通知,请调用 NotificationCompat.Builder.build(),它将返回包含您的具体规范的 Notification 对象。要发出通知,请通过调用 NotificationManager.notify() 将 Notification 对象传递给系统。

必需的通知内容

Notification 对象必须包含以下内容:

小图标,由 setSmallIcon() 设置
标题,由 setContentTitle() 设置
详细文本,由 setContentText() 设置

创建简单通知

以下代码段说明了一个指定某项 Activity 在用户点击通知时打开的简单通知。 请注意,该代码将创建 TaskStackBuilder 对象并使用它来为操作创建 PendingIntent。启动 Activity 时保留导航部分对此模式做了更详尽的阐述:

NotificationCompat.Builder mBuilder =        new NotificationCompat.Builder(this)        .setSmallIcon(R.drawable.notification_icon)        .setContentTitle("My notification")        .setContentText("Hello World!");// Creates an explicit intent for an Activity in your appIntent resultIntent = new Intent(this, ResultActivity.class);// The stack builder object will contain an artificial back stack for the// started Activity.// This ensures that navigating backward from the Activity leads out of// your application to the Home screen.TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);// Adds the back stack for the Intent (but not the Intent itself)stackBuilder.addParentStack(ResultActivity.class);// Adds the Intent that starts the Activity to the top of the stackstackBuilder.addNextIntent(resultIntent);PendingIntent resultPendingIntent =        stackBuilder.getPendingIntent(            0,            PendingIntent.FLAG_UPDATE_CURRENT        );mBuilder.setContentIntent(resultPendingIntent);NotificationManager mNotificationManager =    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);// mId allows you to update the notification later on.mNotificationManager.notify(mId, mBuilder.build());

就这么简单。您的用户现已收到通知。

——以上内容摘自Android官方API指南(https://developer.android.com/guide/topics/ui/notifiers/notifications.html#CreateNotification)

通知是发出了,但是通知之间是不是有优先级呢?要不然怎么解释QQ发来的消息和网易云音乐的消息排在了各个音乐软件之后呢?果然,通知是有优先级的,分为五级,范围从 PRIORITY_MIN (-2) 到 PRIORITY_MAX (2),如果未设置,则优先级默认为 PRIORITY_DEFAULT (0)。

这里写图片描述

这样也就很好解释了为什么QQ和网易云的信息排在了各应用软件之后,如果按照图中的建议,重要的通知是要设置为MAX级别的,而消息或对话则要设置为HIGH级别,同级别通知后来者排在上方。这样也就很好解释了为什么消息在音乐软件的后面,而酷我听书应该是设置为DEFAULT级别,所以排在最后。

现在就到了我们大胆假设的时间了,按照国内软件的调性,类似这种常驻的通知栏优先级别肯定是设置成MAX级别的,而且由于它们自身超强的实力外加激烈的竞争,它们一定会想尽办法把自己排在靠前的位置,这也就是我最大的问题,凭什么蜻蜓FM的排序能在最上面,我第一想到的就是包名,于是我做了个实验。

分别创建两个新应用S和T,包名分别为com.ttt和com.sss,通知优先级都设为MAX,代码完全一样,是否他们的排序会按照包名排序而不是时间排序呢?然而结果并不是。我试着把T里通知的优先级调成10,没有效果。
这里写图片描述这里写图片描述

那剩下的工作就只能交给搜索引擎了,英文的文档里一般都说到优先级就不再向下说了,剩下的都是对通知的设计建议,包括样式以及通知的折叠等——确实,对于软件开发来说,讲到优先级这一步就够了,至于具体怎么排序,那是Android系统的事情,没必要讲出来。而中文文档一般都没有往Android系统对通知的排序原理那方面想。我分别把QQ音乐、虾米音乐、网易云音乐、蜻蜓FM反编译了之后,搜索setPriority()方法,无果,就不贴图了。

综上,我目前能做的就只剩下大胆假设了,最上图中的排序大概率是不会变化的,不过偶尔QQ音乐会排在最前面,说明这跟包名应该没有直接关系,应该和后台服务与前台交互之间实现的逻辑相关,不过这就不是我目前能力能达到的了。

不过反编译也不是没有收获,这是虾米音乐反编译后的结果。根据包名和类名,应该很容易推断出这是和后台唤醒业务相关的优先级,被设置成了1000,阿里系的软件在这方面总是很有水平。

这里写图片描述

以上。

推荐阅读
支付宝后台不死的黑科技:http://zhoujianghua.com/2015/07/28/black_technology_in_alipay/
Android通知栏微技巧,那些你所没关注过的小细节:http://blog.csdn.net/sinyu890807/article/details/50945228

参考资料
Android API指南:https://developer.android.com/guide/topics/ui/notifiers/notifications.html#CreateNotification
Android 设计 通知:https://material.google.com/patterns/notifications.html

1 0
原创粉丝点击