Android通知栏试谈

最先引起我注意的是如下图的情形,从上到下分别是蜻蜓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 app
Intent 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 stack
stackBuilder.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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值