Android开发版本更新及自定义通知详解

Android开发版本更新及自定义通知详解

2023年7月26日发(作者:)

Android开发版本更新及⾃定义通知详解我现在真的羡慕iOS开发程序员,他们既不⽤考虑应⽤升级,更不⽤处理机型适配这些令⼈头疼⽽⽆意义的问题。

——题记本⽂将从以下⼏个⽅⾯详解Android开发版本更新及⾃定义通知的那些坑。Service下载⽂件要注意的⼩细节Android⾼版本通知图标⽆法显⽰(出现⽩框)通知图标只能显⽰中间的⼀部分,⽆法显⽰完整⾼版本通知提⽰⽆法在状态栏中显⽰⾃定义通知⽂字颜⾊适配Service下载⽂件要注意的⼩细节国内Android应⽤市场繁杂,⼏乎没⼈使⽤Google Play下载和升级软件。所以,应⽤程序升级变成了每个APP开发者的任务。Android系统下载⽂件⼀般有三种⽅式:Activity中开启⼀个线程下载、利⽤系统DownloadManager下载和使⽤Service在后台下载。第⼀种⽅式下载时Activity⽆法关闭,使⽤起来⾮常不⽅便;系统提供的DownloadManager⽐较好⽤,开发者⼏乎不⽤考虑任何事情只需要提供下载链接就可以,但是DownloadManager的外观及细节实在做的太差。因此,⼤多数Android产品使⽤第三种下载⽅式——Service。笔者在Service的onHandleIntent()⽅法中接收到MainActivity传⼊的下载链接,并使⽤HttpURLConnection进⾏⽂件下载,业务流程⾮常简单,此处不再赘述。⼀个⼩细节:在MainActivity中应判断下载⽂件的Service是否运⾏,如果已经在下载则提⽰版本更新弹窗,⼀⽅⾯提⾼⽤户体验,另⼀⽅⾯防⽌Service被多次开启引发程序异常。public boolean isWorked() { ActivityManager myManager = (ActivityManager) getSystemService(TY_SERVICE); for (int i = 0; i < (); i++) { if ((i).ssName().equals("your adService")) { return true; } } return false;} ArrayList runningService = (ArrayList) ningServices(Inte使⽤了Service下载,为了不影响⽤户操作就不应该使⽤Activity或是Dialog等更新下载进度,那么我使⽤在Notification加⼊ProgressBar来更新下载进度并通知⽤户是否更新。⽽为了显⽰更全⾯的信息,如下载进度、当前下载速度等等,我选择使⽤⾃定义Notification来完成。(由于产品设计APP主要以iOS系统为参照,安卓版本更新部分并没有任何涉猎,于是这部分功能全权交给我去设计完成,我便⾛上了⼀条⾃⼰给⾃⼰挖坑的不归路。)笔者设计的通知布局如下:左侧显⽰应⽤程序的图标;右侧上部显⽰“xx程序正在下载”,下载结束后显⽰“下载完成,请点击安装”;后侧中部显⽰进度条;

右侧下部包含两个⽂本框,分别显⽰当前下载速度和当前下载进度百分⽐。Android⾼版本通知图标⽆法显⽰(出现⽩框)做好这⼀切后,笔者迫不及待地在测试机跑了⼀遍程序,遇到了⾃定义Notification的第⼀个坑——在Android 5.0版本以前通知可以正常显⽰,但5.0及以后的版本状态栏中只能显⽰出⼀个⽩⾊⽅框,如下图所⽰:究其原因,是Android系统开发者为了统⼀UI样式,限定在Android 5.0版本之后,状态栏显⽰的图标必须只能是⽩⾊的。这显然为难不了我,甚⾄不需要跟产品和美⼯提需求,⾃⼰三下五除⼆⽤PS抠好了图。在构造Notification的时候判断版本,SDK低于21选⽤彩⾊图标,⼤于等于21选⽤纯⽩⾊图标,最终结果如下:通知图标只能显⽰中间的⼀部分,⽆法显⽰完整如果直接把程序图标(ic_launcher)设置为Notification的SmallIcon,某些机型出现的问题是状态栏只能显⽰图标的中间⼀部分,⽆法显⽰完整。原因是原图标(144*144)过⼤,将其重命名并改为48*48并放在xhdpi即可显⽰正常。这个问题在⽹上很普遍并且较易解决,在此不予演⽰。⾼版本通知提⽰⽆法在状态栏中显⽰通知时提⽰的⽂字在Android 5.0之后不显⽰了。跟上述图标⽩框问题相似,Android系统开发者在5.0之后禁⽤状态栏显⽰⽂字(setTicker()⽅法),相仿iOS系统在⼿机上部出现通知弹窗。因此,需要在构造通知时判断版本,SDK低于21使⽤setTicker()⽅法,⼤于等于21使⽤setFullScreenIntent()⽅法,最终结果如下:⾃定义通知⽂字颜⾊适配最后⼀个坑也是最让⼈头疼的坑,则是不同的Android⼿机的⾃定义Notification的⽂字颜⾊适配。市场上流通的Android⼿机有⽆数种样式的通知栏,如果指定了⽂字颜⾊会出现与特殊机型的背景颜⾊相近⽽影响美观的问题。⽽这个问题⼀般有两种解决⽅式:1. ⼲脆连同通知背景颜⾊也指定,保证⿊底⽩字或⽩底⿊字,不考虑通知栏的背景颜⾊。2. 获取到当前系统通知栏及通知的颜⾊数据,根据不同版本做适配。第⼀种解决⽅式显然并不完美,很容易在某些机型出现“极其违和”的通知样式,对于⼀个完美主义者来说这是⽆法容忍的,于是我义⽆反顾地选择了第⼆种解决⽅式。为了给⽤户带来较好的使⽤感受,将⾃定义Notification的布局北京设置为透明,这样⽆论图⽚⽂字还是进度条看起来都是“嵌⼊到通知栏背景”中。在Android 5.0版本前, 通知栏的背景以⿊⾊(灰⾊)为主,⽽在其之后通知栏以⽩⾊为主。笔者灵机⼀动,不指定TextView的⽂字颜⾊,是否就是系统默认的颜⾊呢?经测试此⽅法在低版本机型成功率较⾼,⾼版本普遍出现了问题。因为TextView的背景颜⾊并不等同于通知栏的背景颜⾊,所以⽂字颜⾊(可以理解为背景颜⾊的相反颜⾊,即对⽐⾊)也并不⼀定相近。第⼀种⽅式失败之后,笔者查阅资料,有另外⼀种解决⽅式是我们可以先构造⼀个Notification(并不发出通知)并获取其中title的颜⾊,这样我们可以在⾃定义Notification沿⽤该颜⾊,代码如下:private int getNotificationColor() { r builder = (r) new r(this); Notification notification = (); ViewGroup viewGroup = (ViewGroup) (this, new LinearLayout(this)); TextView title = (TextView) ewById(); return rentTextColor();}但在⾼版本机型依旧出现空指针异常的问题,tView为空,具体原因笔者没有深⼊研究,⼤概是低版本系统Notification也像是⾃定义Notification⼀样使⽤了系统提供的RemoteViews,⽽⾼版本已经不再使⽤这种⽅式构造通知。最终笔者选择的解决⽅式是设置TextView中的textAppearance属性,SDK低于21使⽤android:样式,⼤于等于21使⽤android:样式,⼏乎能适配⼤部分系统。但仍有⼀部分⼿机开发者改变了原⽣Notification的背景,⽐如笔者的⼀款测试机——三星S5,⿊⾊半透明通知栏+⽩⾊通知背景+⿊⾊⽂字。这样使⽤的⽂字颜⾊(⿊⾊)直接放在通知栏处(⿊⾊)⾮常冲突,⽽这个问题笔者想了好久,尝试获取到通知栏背景⾊从根本上解决这⼀问题,但似乎官⽅并没有给出任何⽅法。何况很多⼿机更改了系统状态栏,背景颜⾊并不是⼀个值,⽽是有不同颜⾊的⼀幅图⽚,想去获取颜⾊恐怕只能⽤Bitmap去解析⼏个点的ARGB值了。总结希望Google官⽅以及各个⼿机⼚商的开发者们能够在追求UI与众不同的时候,考虑⼀下其他Android开发者们做适配的难处,能够提供出通知栏的背景颜⾊(哪怕给出是深⾊还是浅⾊)就再好不过了。如果读到这篇⽂章的你恰巧知道获取通知栏背景颜⾊的⽅法,⿇烦能分享给我,笔者不胜感激。

发布者:admin,转转请注明出处:http://www.yc00.com/news/1690318239a331828.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信