美文网首页
天气王v9.1开发总结

天气王v9.1开发总结

作者: 袁阳 | 来源:发表于2020-05-08 20:27 被阅读0次

    天气王v9.1负责小组件,通知栏技术优化,共有以下收获:

    1、提升进程优先级

    2、通知栏UI适配

    3、PendingIntent用法

    提升进程优先级

    天气王常驻通知栏在9.1版本之前采用的是普通Service + 通知形式展示的,在反编译竞品APP后发现,竞品使用的不是普通Service,而是前台Service。前台Service与普通Service主要区别在于:前台Service会显著提高进程优先级。在将天气王Service修改为前台Service后,在adb shell中,通过cat /proc/pid/oom_adj获取进程优先级发现,天气王优先级由12提升到了4,通过修改包名,将修改前后的天气王安装在同一台设备上,然后不断打开其他APP以模拟低内存环境,发现修改前的进程很快回收,但是修改后的不会被回收。

    在对比竞品时,我们也发现,竞品在首页点击返回时,会直接将APP放入后台,而不是结束Activity,这种方式也会让APP优先级升高,但这样会占用更多内存,将触发设备LMK更频繁地杀后台应用。

    在测试时发现,对比Vivo,华为,小米等厂商,Oppo的后台限制策略是最严格的,甚至在Oppo A5上发现,一旦进程中没有Activity,APP立马被回收,前台Service也会被强制杀死。

    从这次提升优先级的过程中,让我对Android进程优先级有了更深的理解。这里虽然没有保活的黑科技,但是对于天气这类应用,能保证前台Service尽可能的显示,给用户查看天气带来便利,也无需追求进程“永生”。

    通知栏UI适配

    通知栏应该是Android开发中兼容性问题最多的地方,7.0以下,几乎每个厂商都会修改通知栏。包括通知栏布局,背景,字体颜色都是他们修改的对象。天气王9.1改版将通知栏文字颜色修改为黑色,但是在部分黑色背景下,这些文字就会跟背景冲突,造成UI问题。

    针对这些问题,经过调研,业界有两种解决方案,一种方案是通过写死通知背景,这样系统厂商再怎么修改也不会造成文字颜色与背景冲突,另一种方案是背景跟随系统通知栏背景,但是通知栏字体颜色与默认通知栏字体颜色保持一致,因为系统默认通知栏不会出现颜色冲突。但是,如何获取系统通知栏字体颜色?

    这里有个取巧的方法:先创建一个系统默认通知,但是不调用notify将通知刷新到通知栏,然后从通知中获取通知的布局View,遍历该View,找到Title字体颜色和Content的字体颜色,怎样遍历?树的遍历。怎么知道哪个View是Title,哪个View是Content?我们可以给通知设置特殊的title跟content,在遍历View树时,如果该View是TextView并且TextView.getText等于我们设置的文字时,该View就是我们要找的Title和Content。拿到Title和Content后,我们的通知栏就使用色值去填充通知栏。

     PendingIntent用法

    由于之前没使用过PendingIntent,在设置小组件点击事件时,我发现后面获取的PendingIntent总是会覆盖之前获取到的PendingIntent的属性,比如在前一行代码中获取的PendingIntent是刷新天气的,接着一行代码获取PendingIntent是跳转主页的,但是在运行时,第一个PengdingIntenet竟然跳转到主页了,当时以为遇到了系统bug,但是换了台机器,发现有相同的问题,后查看PendingIntent的源码发现,PendingIntent会将RequestCode和options组成一个Key,当我们获取PendingIntent时,通过Key查找Intent,如果没有对应的Intent,则创建新的Intent,并将Key和Inten放入HashMap中缓存,如果缓存中已经有Intent,再根据options的不同,对Intent进行修改,也就是说,针对同样的RequestCode和options参数,AMS查找到的Intent是同一个,这就导致后面获取PendingIntent会修改原有的Intent,举例:第一行代码的PendingIntent是刷新天气,第二行代码在使用同一个requestCode和options获取跳转到主页的PendingIntent时,会将第一个Intent的数据换成第二个,这样在点击RemoteView时,系统获取到的就是修改后的Intent,那执行的行为就是修改后Intent的逻辑了。

    相关文章

      网友评论

          本文标题:天气王v9.1开发总结

          本文链接:https://www.haomeiwen.com/subject/vfzxuttx.html