我即将在2017.7.8号开一个直播讲堂,感兴趣的同学点击快来参加吧:https://segmentfault.com/l/15...
内容包括:
Android 知识体系分享
从入门到提高的学习路径
如何进一步突破瓶颈,进一步提升
充足的时间和大家讨论,回答大家问题
自我介绍:
网易 Android 专家工程师,网易云音乐 Android 负责人,主导从零开发了网易云音乐 Android
客户端,目前是杭州研究院专业委员会成员,负责每年的评级,规范起草,面试招聘等相关工作。参与并制作了网易云课堂 Android
微专业相关课程,反响不错。
说起通知栏,是一块各个应用的必争之地,不显示通知栏就意味着没有存在感,通知栏显示得不靠前还得想方设法提前。加上OnGoing的通知还能提升进程优先级,大有被滥用的趋势。为了保活,虽然没啥必要也得起个通知。甚至还有一些不显示通知的前台Service黑科技广为流传,可以参考这里。厂家和开发者的战斗越演欲烈,到现在即使OnGoing的Service放后台也照杀不误,真是可怜了我们这群做音乐的。于是后台应用保护白名单,下拉锁定,手机管家,省电模式,神隐模式等等用于限制后台运行的功能越来越多,可想应用怎么斗得过系统?
还好Android上面有一键清除所有通知,否则现在一个App要出N个通知的情况要吐血。每一条新闻要出个通知,一天要通知好多次。自己保活不了不算,还要别人拉起来帮忙通知(后台startService起另外一个程序的用法也被比如华为系统限制)。我们在抱怨后台越来越被限制的同时,也要思考自己软件是否做到了尽量少骚扰用户。
通知栏的开发每个人心中都会有些伤痛。主要有以下几点:
通知栏没有显示
通知栏不更新
点击没反应
通知栏上面内容看不清
通知栏的样式长得跟其他不一样,自己的独树一帜很突兀
事实上从Android的历史版本来看,通知栏这个设计也是被改过了非常多次,不仅仅是样式,还有各种功能改动,包括最新的O版本。为了保证更好的兼容性,我们建议:
1.遵循通知的设计的初衷
Communication from other users
Well-timed and informative task reminders
如官方所描述,通知用于和他人交流或者是有用任务提醒。所以在考虑是否使用通知的时候思考你的通知是否属于上述两类。是否用户一天到晚都需要关心你的通知,你的通知对于用户价值是咋样的。你的所有东西都往上面丢也意味着别人可能也这么做,两败俱伤。
通知栏不显示
高版本的原生系统自带通知栏显示管理功能,默认是允许显示。但像oppo系统却默认不允许显示。 和厂家沟通是为了减少对用户的影响。这种粗暴的管理方式甚至连音乐App也无法幸免。国内默认白名单的估计也就是QQ和微信了。对于这种特权App待遇处理又无奈又愤怒。我们能做的只能是检测手机然后做引导提醒。
3.通知栏不更新
同样发现在oppo,vivo手机上面,可能是出于性能考虑限制了更新频率,通知发送太快可能会被忽略,这样偶尔会导致通知栏不更新。这种情况可能在音乐App上容易出现,更新信息同时需要更新图片。我们能做的就是故意做点延迟,目前经验值是200ms。
4.点击没反应
除了代码bug,厂家这边的问题有发现在华为部分系统上面,因为对通知栏进行了修改增加了第一次显示通知时同时显示是否允许按钮,怀疑这个修改导致了bug,用户即使点了允许显示了通知,也无法对通知上面的按钮进行操作,直到下一次通知刷新才正常。
5.通知上面的内容看不清,通知样式长得跟其他通知不一样
这个问题是因为使用了RemoteView来实现自定义通知。原生系统其实提供了很多style,但往往需求的实现是复杂的。不可避免的在使用自定义通知的时候我们可能有几种方法尽量增加兼容性:
5.1 不要使用自定义背景,显示了指定一个颜色意味着你就很特殊,很大几率跟别人长得不一样。而且即使是给RemoteView设置background,据我们经验仍然在有些机器上面不起作用,很可能厂家考虑到了这个问题直接忽略掉了背景。当然指定背景也能解决一部分文字看不清问题,但这个方案不怎么推荐
5.2 通过起一个通知来获取文字颜色,原生系统提供了三行文字,对于文字样式不多的情况可以尝试这种方法,但据我们之前尝试也还是存在获取颜色失败等兼容问题,相关代码类似这样,来源这里
5.3 读取系统通知的style来设置文字样式,style高低版本上面有所区别:
Title字体@android:style/TextAppearance.StatusBar.EventContent.Title
Content字体@android:style/TextAppearance.StatusBar.EventContent
Title字体@android:style/TextAppearance.Material.Notification.Title
Content字体@android:style/TextAppearance.Material.Notification.Line2
云音乐目前采用的就是这个方案,但也会有坑,直到某一天厂家来反馈说我们修改了系统通知栏底色,但忘记修改上面提到的style了。。。最终云音乐使用了这个方案结合修改通知栏底色,不过修改底色是放在设置里面作为一个用户选项。
5.4 没什么特殊情况,请尽量使用系统通知Style。这种兼容性肯定是最好的,事实上随着Android这些版本的升级,加入了越来越多的模板能够满足了绝大部分的需求。如果你还是遇到需要自定义的情况,要么是开发没想到可以用系统模板,要么就是视觉交互不满意原生样式。是时候拿出上面这些理由了。
接下来我想聊一聊通知栏的跳转设计。
通知的点击代码很简单,调用setOnClickPendingIntent设置下就可以了。但往往业务逻辑没有那么简单,有些页面打开是需要登录的,程序还没任何页面启动话需要看一次广告等必须要解决前置一些条件。或者程序运行中task里面的root activity必须是我们的首页。这种情况其实比较常见,因为我们很不想加的退出应用功能最好的方式就是通过Intent的FLAG_ACTIVITY_CLEAR_TOP来实现的。清理掉root activty上面的所有activity之后再finish自己。这种实现就要求root activity比较固定。
所以最好设计一个跳转协议,如果页面还未启动则走正常启动流程,页面已经启动了则直接打开目标页面,大概代码可能是这样,这是RedirectActivity里onCreate的代码:
以上经验来自我的团队,感谢我的团队。如果有遇到问题可以留言和我们讨论。
如果感兴趣,请关注微信公众号:anzhuozhimei