安卓的通知到底有多少特性

1,999 阅读14分钟
原文链接: mp.weixin.qq.com

不讲技术,更多的是从产品的角度来解读“通知栏”。


Android 从较早期开始就有很壮大健全的通知系统。这里说的通知系统单指app在系统上发出的通知的样式,而不包含从服务器给手机终端推送一条消息的过程,因为众所周知那部分做得并不好。

说健全是说 可以展示的内容的多样性、灵活性都有很好的表现,且随着版本迭代,也越来越不只是健全,还有健康性、安全性。苹果 iOS 系统的通知的展现到了某个版本之后也很大程度上借鉴了 Android 通知的设计和理念。这也是为数不多的苹果可以从 Android 上借鉴的地方。

由于一些历史原因和产品经理及大众固有的偏见,国产 Android app 发出来的通知千篇一律,即使是伟大的微信,也没有随着迭代利用新的通知特性。

Android 发展时代最大的分水岭就是从 Android 4.x 开始的,从这一代开始很多特性都突飞猛进。Android 4.1之前的通知就是普通的通知(标题和内容)、进度条通知和自定义布局的通知,

Android 4.1 JellyBean 开始通知有了大的变化

首先是加入了可展开的通知,方便先显示一个通知的概括,当手指在通知上下划时可以展开,显示更多行的文本甚至图片。

[可展开通知]

同时加入了Action,对一个通知最多可以加三个快捷操作。

[通知快捷动作]

从 Android 4.1开始,用户可以关闭应用的通知防止打扰。

Android 5.0 Lollipop 的时候,加入了锁屏下显示的通知。

[锁屏通知]

并且系统层面增加了勿扰模式,通过设置优先级可以决定是否在勿扰下通知用户。如果设备在解锁的状态下收到一条优先级为“重要”的通知,会在屏幕上方短时间提示用户。

[Head-up 通知]

Android 7.0 Nougat  增加了可以从通知栏直接回复的特性。

[直接回复]

Android 8.0 Oreo 增加了通知频道(channel),让用户可以针对同一应用的不同类型的通知做不一样的开关或是提醒设置。

[分频道设置]

可以说能力已经登峰造极了。Android 8.0 还增加了如应用角标、稍后提醒和 app icon 通知等功能。

[App-icon通知]

看到这么多特性,再看看自己开发的 app 只能简单地发出一个最普通的通知,有没有一点被抛时代之后的感觉?

还有两个东西要知道。

后台长驻

以前Android的系统比较二,app可以无限申请内存,也可以无限在后台运行。这一点广被大众病诟。后来到 Android 4.3 (JellyBean_MR2, API level 18) 时,系统要求,如果一定要在后台长时间运行,必须发出一个长驻(Ongoing)的通知,这种通知你横划是划不走的,就是要显式告诉用户app在后台运行,这样用户就知道那些消失的电量和流量去哪儿了。一般app有东西在下载或上传执行这种耗时的操作时需要显示这种通知。

自定义布局

虽然Android很早就有了自定义布局的通知,但是一般app并不会使用这种,不仅开发不方便,而且在不同的系统上表现不一样会给应用减很多分,尤其在小米和华为上表现突出,当然解决办法也是有的,就是麻烦。一般就是有一些特殊需求才用,早期时可以使用这种方式做音乐播放类的app,方便用户不进入app就可以控制音乐播放。不过到 Android 4.1的时候在可扩展的通知类型里有一种 MediaStyle 的通知,专门用来做媒体控制了。

[媒体控制]

上面说到的发展,还是比较粗略,有很多细节未提到,加上各种配图,应该对不同阶段的通知的能力有一个大致的了解了。


实际开发中,一般哪些情况要发通知都是产品经理定义好的。通常收到的产品文档通常是一句话带过:“当****时,app发出通知,标题是 aaaa,内容是 bbbb”。最多再说带个图标显示什么。普通的开发者会觉得发个通知再简单不过了。但请不要做普通的开发者,上面说的那一堆特性都是 app 的加分项,请分分种加上。

举个栗子,一个坏栗子,优酷客户端。

视频端最大的利益点就是流量/广告,所以 app 会推送各种推荐和广告无可厚非。所以每次进优酷的时候它会干这么个事:

[优酷提示]

他检测到我没有打开通知的权限,就弹出一个框,让我打开通知。我当然不会开启。因为一旦开了,它会天天发广告。后来我想提前缓存个电影在地铁上看,点了缓存后,他又给我一个提示,让我打开通知。(此处没捕捉到截图,大家脑补下,大约就是打开通知能更好的下载)

上面说到有一种通知是可以一直在通知栏里显示不消失,这种通知的用处就是可以保持 app 在后台运行,即使当系统内存不足时系统也尽量不杀死app。缓存类的功能就由此受益了。

由于我关了优酷的通知权限,所以我如果在后台缓存视频时过一会优酷被系统终结了,那我视频就无法缓存了。于是这时候我就很想去允许其发出通知,这样可以优酷在后台下载,即使我退出界面也不会停止下载。然而跳转到权限界面时我看到了这个:

[优酷通知设置]

我如果是这个功能的的开发者的同事,我会狠狠送上我的鄙视。对通知特性没有利用不说,还在里面建立了一个“未分类”,而另一个是一串看不懂的文字。于是我并没有打开通知权限,因为我一旦打开,他会每天给我发送推荐视频,而这些推荐也并非基于我的喜好,而基于大众喜好。不惯这毛病。

那通知频道通知的正确姿势是什么呢?如下图:

[爱奇艺通知设置]

同样是视频app,差距这么大。难能可贵的是开发者不仅做了分频道,还做了分组分类,而且每一种通知有不同的优先级。哪个开关用于什么功能一目了然。于是我关掉了除了下载通知外的其它所有。当然这一行为会影响他们的KPI啥啥的指标,不过我更在意体验。

发现爱奇艺里也有一个“未分类”的频道,猜想是他和优酷都集成了某个第三方的库,这个库要发出通知,这个库建立了这么个频道。但出现在爱奇艺里上下一起看就不会觉得违和。

不管是产品经理细致到定义了这么深度的体验,还是开发者不甘写出平凡的代码自己写了这么多,都值得一赞。

通知还新增一项可以自己定义的特性,就是优先级。不过这个优先级从 Android 8.0 开始已经不只是可以由开发者来自定义了,用户也可以对其优先级做更改

优先级分为4档,紧急、高、中、低

紧急:会弹出窗口(一般是当屏幕亮时显示在屏幕上方一小会儿后消失)

高:时像之前的普通通知一样会发出通知声音或是振动

中:时就没有声音了

低:那下拉打开通知栏时会默认把它折叠起来,以免造成信息干扰

这个优先级用户是可以修改的,开发者只有在第一次发出通知时,能对这条通知所在的频道做优先级设置,之后就只能由用户来改了。

对于中、高和紧急可以设置其是否可以在锁屏上显示(隐私性);中级 是不会发出声音的;高和紧急还可以设置声音和振动,而低优先级则没有可定义的项。

不同优先级的通知在通知面板上由高到低排列(一些系统上会按应用分组)。

如果产品经理可以合理地定义好每一种通知应该怎么样发出,通过折叠或不发出声音的方式减少干扰,那来自用户的抱怨会少很多。


我曾经以为既然用户可以自己设置优先级,那对于不喜欢而又不能全盘禁止的通知(像优酷这种)只要折叠不就好了?然而事情并没这么简单。

比如,再举个反例,小米运动 app。连接了小米手环时,app 要长期在后台运行以保持蓝牙连接,如果不让 app 长时间在后台运行,那么蓝牙就会断开,上面说过,用长驻(Ongoing)通知就可以让 app 长时间在后台运行,所以我就打开了这项通知。所以通知栏里会显示一个通知:

[小米运动通知]

如上图所示,同样为长驻通知的“免打扰通知”就成功地折叠了,不对我的视觉体验有负面影响,所以我当然也想把小米运动 app 的通知也折叠,进入其通知设置看看:

[小米运动通知设置]

通知只能设置其全局开关不能改优先级。

我的手机系统已经都 Android 9.x 了,为什么设置通知还是不能设置声音或是优先级呢?这是为什么呢?

这不是什么黑魔法,而是开发人员没有随着时代的发展而更新代码。简单来说,小米运动的代码编译的 targetSDK 是 23 (Marshmallow, Android 6.0),而当时通知并没有频道和优先级修改的特性,为了防止一些不必要的错误,所以展示为旧特性的通知。

这个逻辑的原理是:

每次Android系统版本更新时会带上一些新特性(功能),这些特性很当然地只能在高版本上使用。如果在开发这个app时高版本还没有出来,所以通常理解为这个app更希望以旧版本的方式运行,或者说为了避免在旧版本上测试无误的功能使用了新旧版的特性后会有bug,所以即使当高版本出来以后,如果代码的编写是针对旧版本的,那么在一些情况下还是延用旧的方式。而这里的“针对旧版本”并不是看代码的编写时间,而是在代码编译时有个叫targetSDK的参数,表示你的代码是针对某个版本的Android编写的。这里逻辑可能有点绕,要细读一下。

一个健康的团队,应该随着Android 新版本的发布,提高targetSDK的数值,以便使用到系统的新特性。修改了targetSDK并不会影响app可以在哪些版本的系统上运行,那些由其它参数决定,这里按下不表。

我之所以举了小米运动app的例子,是因为这里的例子重点要说分频道设置通知和优先级修改。而下面要举的栗子,是微信的栗子,而且也是个反面教材。

前面说从 Android 4.1 版本加入的可伸展通知(Expaned)。可伸展的通知有三种样式:大文本,收件箱和图片通知。

大文本(BigTextStyle)可以用于即时消息通知,较新版本的系统短信就使用了这一通知样式。这种通知刚发出来像普通通知一样普通,当在通知上向下滑动时会展开通知,显示出通知文本的更多内容。

收件箱样式(InboxStyle)比较少见,应用的场景也是即时消息通知,可以显示出多条同类型的文本,但是文本只能显示一部分,就像我们打开了短信界面看到的梗概一样。个人认为这个用在微信的消息提醒上是再适合不过了。还可以用在邮件app上。

[邮件的inbox-style]

图片样式(BigPictureStyle)的通知,顾名思义,就是可以在通知栏显示个图片。这种一般现在截图后都是这种。一下拉能显示出大的图片,能通过action直接分享编辑或是删除。已死的Path app,在关注的人发布一条新图片时,就会以这种方式来展示,比起微信的“收到一张图片”不知道高到哪里去。

[收到多条微信]

微信Android的程序写代码的 targetSDK 还是 23 (Marshmallow, Android 6.0),是我没有想到的。可即便是23,也是已经包含了可扩展通知特性的。而微信程序的通知自始至终都是简单的通知,收到了图片也不会显示出来,收到多条也只是简单显示一个[x条],毫无特色。

而且,作为一个消息app,不能直接从通知栏回复消息,实在是让我大大失望。不知道是微信那么大的团队看不到这些问题吗?还是这些连我都能头头是道的要点不太好写入代码里。无论产品经理还是开发人员都应该被鄙视一下。连优酷都不如。而Twitter、Facebook 等 app 早就跟上了。

[Twitter with actions]

最后一个平凡而有用的特性就是通知动作 Action。Action 是一组可以附加在通知上的快捷动作,最多可以加3个。比如对于一条短信可以作删除、已读动作,比之前只能横划和点击,意义和能力都大大提高。就不多说了。


谷歌在去年就发出通知

从 2018 年 8 月 1 日起,所有向 Google Play 首次提交的新应用都必须针对 Android 8.0 (API 等级 26) 开发; 2018 年 11 月 1 日起,所有 Google Play 的现有应用更新同样必须针对 Android 8.0。

现在是11月1日,到目前为止微信在 Google Play 还是没有更新版本。而下一次微信团队想在 Google Play上传微信的更新,就必须是 targetSDK 26+了(就在刚才,超过一年多没更新的 QQ 已经更新了)。这是 Google 为改善 Android 碎片化现状的重要举措。没有想到微信这样的团队会没有注意到这个问题。 哎,越说越气。

上面说的“针对xx开发”,所涉及到的是谈论 Android 时不会跳过的一个话题:兼容性

说到Android上的兼容性,很多人脱口而出一个词,碎片化。随着现在Android生态已经健康起来,单纯的用这个词来形容 Android 已经有点落伍,但之前版本留下的病灶还是不容忽视。为些谷歌爸爸做了很多努力,比如推出了很多解决不同版本系统接口变化引起的兼容问题的库,使得同一套代码用很少的逻辑就可以顺利的运行在各版本系统上。当然,通知系统经过这么坎坷地发展,自然有很多第三方开发者贡献出很多相似的开源项目。比心❤️开源。这里就不对库做使用上的介绍了。

将来希望有机会对“碎片化”话题做一个展开。


题图是Android Oreo 的吉祥物。

Oreo 是Android 8.0 的名称。

Android 8.0 开始有了分频道(channel)通知。

安卓目前最新版本是 Android 9.0 Pie