Android进程拉活包括两个层面:
- 提升进程优先级,较低进程被杀死的概率
- 进程被杀死后进行拉活
- 提升优先级(具体实现代码看https://zhuanlan.zhihu.com/p/21987083?refer=bugly)
系统优先级:前台>可见>服务>后台>空进程
-
- 利用Activity提升权限
监控手机锁屏事件,在屏幕锁屏时启动1个像素的Activity,在用户解锁时将Activity销毁掉。注意该Activity需设计成用户无感知
的。
通过该方案,可以使进程的优先级在屏幕锁屏时间由4提升为最高优先级1。
此方案主要解决第三方应用及系统管理工具在检测到锁屏事件后的一段时间(一般为5min)以内杀死后台进程,已达到省电的目
的。
适用于所有的Android版本。
-
- 利用Notification提升权限
Android中Service的优先级为4,通过setForeground接口将后台Service设置为前台Service,使进程优先级由4提升为2,与可见
进程的优先级一致,使进程被杀死的概率大大较低。
实现方案:通过实现一个内部Service,在LiveService和其内部Service中同步发送具有相同ID的Notification,然后将内部Service
结束掉。随着内部Service的结束,Notification将会消失,但是系统优先级仍然保持为2。
此方案作用:防杀,使service不容易被系统杀死。
- 进程死后拉活方案
-
- 利用系统广播拉活
通过在AndroidManifest中“静态”注册对应的广播监听器,即可在发生响应时间的时候拉活。
常用的用于拉活的广播事件:开机广播、网络变化、文件挂载、屏幕亮灭、锁屏解锁、应用安装卸载。
该方案有以下几点缺点: 1.广播会被禁用,从而无法自启
2.广播事件发生时间不可控,不能做到进程立即拉活
-
- 利用第三方应用广播拉活
微信上分享给QQ,拉活QQ。
通过反编译第三方Top应用,如:手机QQ、微信、支付宝、uc浏览器等,找出它们外发的广播,在应用中监听,这样这些应用发出广播时,就会将我们的应用拉活。
-
- 使用service
将Service设置成为START_STICKY,利用系统机制在service挂掉之后自动拉活。
缺点:
-
-
- service第一次被异常杀死后会在5秒内重启,第二次杀死会在10秒内启动,第三次会在20秒内启动,一旦短时间内Service被杀死的次数达到5次,则系统不再拉起。
- 进程被取得Root权限的管理权限或系统工具通过forestop停止掉,无法重启。
-
-
- 使用Native进程拉活
主要思想:利用Linux中的fork机制创建Native进程,在Native进程监控主进程的存活,当主线程挂掉后,在Native进程中立即对主线程进行拉活。
主要原理:在Android中所有进程和系统组件的生命周期受ActivityManagerService的统一管理。而且,通过Linux的fork机制创建的进程为纯Linux进程,其生命周期不受Android的管理。
-
- 利用JobSchedular机制拉活
主要适用于Android5.0以上版本手机
-
- 利用账号同步机制拉活