本文就Android保活的话题展开实践
一、在android项目运行过程中,如果锁屏,你会遇到以下两种情况:
1、如果熄屏时间不太长,当手机再次解锁,你会发现程序还会继续运行,也就是继续运行熄屏前的某个页面
2、如果熄屏时间长,当手机再次解锁,你会发现程序重新开启了闪屏页,重新启动了一遍
以上两种情况下都会影响到我们程序的运行
第一种情况是自Android 6.0以来的Doze模式引起的,Doze模式是官方为了节省手机电量,当手机处于后台运行时,让进程休眠的一种机制,这个可以查资料了解一下;Doze模式下有一个特点就是进程并非被杀死,而是被停滞,如执行的handler会被停滞,当插上电源或者解锁屏幕的时候,会突破Doze模式,此时先前的handler会继续运行
第二种是LMK(Low Memory Killer)引起的,这个是进程杀手,当手机内存不足,需要优化的时候,它决定了该杀死哪个进程;它会为每个进程打分,分值越高就越容易被杀,这个可以通过adb命令查询进程处于不同状态时的分值:
当app处于前台,分值adj_score: 0
当app处于后台,并且开启了前台service,分值:3
当app处于后台,不开启前台service,分值:11
这也就是为啥app处于后台时要开启前台服务,可以减少app后台运行时被杀的概率
二、以上两种情况 当我们的app想在后台执行一些任务时,都会被停滞或者被杀死,会阻塞到我们的业务流程,那么如何解决呢?
针对LMK 我们可以给app加前台服务,提升进程的优先级
针对Doze我们测试一下网上的保活方案:
1、wakeLock防止系统休眠,这个经过测试不好使
2、两个service互相检测对方是否存活,如果其中一个死了 另一个将其启动救活,经测试不好使,两个service都会被杀
3、一像素Activity方式,当监听到锁屏的广播时,开启一像素的Activity,当监听到解锁的广播时,销毁一像素Activity,其目的是想提高app的优先级不被杀,Doze模式下不好使,该停滞还是会停滞
4、handler 定时任务方式 后台运行了4min (不同机型,存活时长不一样,但是都只是几分钟)
5、alarmManager定时任务方式 后台运行了2min (不同机型,存活时长不一样,但是都只是几分钟)
6、JobScheduler定时任务方式 后台运行了4min (不同机型,存活时长不一样,但是都只是几分钟)
7、后台播放音乐方式,在华为以及荣耀系列成功存活 3小时+,小米9、红米note8成功存活3小时 +,但是在oppo K7下只存活了5min,如果播放的是纯无声音乐,那么也是只能存活几分钟
三、测试那么多方案都不好使,那么有没有真正好使的保活方案呢,有的!不信你看微信,即使你后台息屏好长时间它依然收到新消息,还可以弹出通知栏,为什么呢?
答案是:应用启动白名单!
微信几乎是各大厂商都默认会后台保留,不会主动杀死,不会被Doze的app,事实上,只要是被加入手机自启动白名单的app都不会被Doze也不会被杀死
经测试过可靠的方案:
引导用户手动去设置app的自启动模式,允许后台自启动,允许后台运行,这种方案是不管任何机型都好使的方案,只不过此方案需要我们去调研各个品牌手机主流机型的自启动设置流程,然后集成到项目中,可以作为依赖库供项目使用,这种方案是可靠也是最省电的保活方式
具体设置如下,以华为手机为例:
网上很多介绍的保活的方案,几乎都不好使,或许想要实现真正的保活如果不是让用户手动开启白名单,用技术手段去实现后台不死,目前来看可能真的是个伪命题,倘若真的有这种永生不死的技术,那么我们的手机就要废了,可能一天得充无数次电,这肯定得得到用户的授权同意才可以,要不然手机就没法用了
好了,本次总结到这里,有好的保活方案的话可以私信我,大家一起进步,感谢!