我即将在2017.7.8号开一个直播讲堂,感兴趣的同窗点击快来参加吧:https://segmentfault.com/l/15...
内容包括:android
Android 知识体系分享面试
从入门到提升的学习路径segmentfault
如何进一步突破瓶颈,进一步提高微信
充足的时间和你们讨论,回答你们问题性能
自我介绍:学习
网易 Android 专家工程师,网易云音乐 Android 负责人,主导从零开发了网易云音乐 Android
客户端,目前是杭州研究院专业委员会成员,负责每一年的评级,规范起草,面试招聘等相关工做。参与并制做了网易云课堂 Android
微专业相关课程,反响不错。字体
提及通知栏,是一块各个应用的必争之地,不显示通知栏就意味着没有存在感,通知栏显示得不靠前还得千方百计提早。加上OnGoing的通知还能提高进程优先级,大有被滥用的趋势。为了保活,虽然没啥必要也得起个通知。甚至还有一些不显示通知的前台Service黑科技广为流传,能够参考这里。厂家和开发者的战斗越演欲烈,到如今即便OnGoing的Service放后台也照杀不误,真是可怜了咱们这群作音乐的。因而后台应用保护白名单,下拉锁定,手机管家,省电模式,神隐模式等等用于限制后台运行的功能愈来愈多,可想应用怎么斗得过系统?spa
还好Android上面有一键清除全部通知,不然如今一个App要出N个通知的状况要吐血。每一条新闻要出个通知,一天要通知好屡次。本身保活不了不算,还要别人拉起来帮忙通知(后台startService起另一个程序的用法也被好比华为系统限制)。咱们在抱怨后台愈来愈被限制的同时,也要思考本身软件是否作到了尽可能少骚扰用户。设计
通知栏的开发每一个人心中都会有些伤痛。主要有如下几点:code
通知栏没有显示 通知栏不更新 点击没反应 通知栏上面内容看不清 通知栏的样式长得跟其余不同,本身的独树一帜很突兀
事实上从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