参考资料
背景
随着Android系统的不断升级以及各大厂商为了自身省电而深度定制,在退出应用或手机息屏或强制清除内存后,产品的提醒及桌面插件失效。而归其原因还是我们的后台提醒service被系统回收或强制清除了。那么如何保证我们的service不被回收killed而永生不死呢?答案是不可能的!!目前我们只能提高进程存活率,在进程被killed之后能够成功拉活(在不加入白名单的情况下无法完全保证,特别是小米、华为这种深度定制的手机)。
保活手段
上面文章提到的黑色、白色、灰色保活方式。
黑色保活:不同的app进程,用广播相互唤醒(包括利用系统提供的广播进行唤醒,其实这也是一种拉活的方式)。
白色保活:启动前台Service。
灰色保活:利用系统的漏洞启动前台Service。
其中白色和灰色的体验经过测试都不太好,加上之后在通知栏会有“XX正在运行”的notification,影响用户体验。经过修改优化后的方式:
在息屏时startForeground从而提高Service优先级,在亮屏时stopForeground恢复优先级从而消除通知栏notification。
另外还有一种提高优先级的方式,监控手机锁屏解锁事件,在屏幕锁屏时启动1个像素的 Activity,在用户解锁时将 Activity 销毁掉。通过该方案,可以使进程的优先级在屏幕锁屏时间由4提升为最高优先级1。
以上两种方式都能够提高service存活率,也是目前产品中在使用的保活措施。
拉活措施
所谓拉活,是指在进程已经被killed的情况下重新启动。
安卓保活大全中也介绍了一些。
1. 通过系统广播或第三方广播拉活。万年历中也采用这种方式,通过监听开机、网络、解锁等系统广播及个推广播拉活。(具体可参见WatchmenReceiver类)
2. 利用系统Service机制拉活。即service中onStartCommand方法设置flags = START_STICKY;或者onDestroy中重新启动service。
3. 守护进程,开源库Android-AppDaemon。但是经过验证在小米、华为手机中都无效。
4. 以及JobScheduler和账号同步机制,但是这两种感觉限制较多(5.0及同步时),暂时未考虑。
对于拉活措施现在产品中只是使用1、2两种方式,其他方式暂时未采用,而这两种方式对于forcestop的都没有作用。
综上,目前的保活及拉活方式只是提高进程的存活率,无法保证service一直运行,为保证不被killed,加入白名单、自启动等才是王道!
9月8号补充:双进程守护保证remote提醒进程存活率Daemon;这个对6.0以下版本有大效果!
最近又把使用的保活手段整理了下,已上传至github------KeepAlive。
网友评论