Android进程保活学习记录

参考

进程等级

  1. 前台进程 (Foreground process)

  2. 可见进程 (Visible process)

  3. 服务进程 (Service process)

  4. 后台进程 (Background process)

  5. 空进程 (Empty process)                                                                                                                                                                 

方法1.利用Activity提升权限

方案设计思想:监控手机锁屏解锁事件,在屏幕锁屏时启动1个像素的 Activity,在用户解锁时将 Activity 销毁掉。注意该 Activity 需设计成用户无感知。

通过该方案,可以使进程的优先级在屏幕锁屏时间由4提升为最高优先级1。主要思路是用户锁屏时激活用户解锁时关闭,该活动为像素级大小活动,且透明,android.intent.action.USER_PRESENT理解见ndroid.intent.action.USER_PRESENT

 

 

方法2. 利用 Notification 提升权限

方案设计思想:Android 中 Service 的优先级为4,通过 setForeground 接口可以将后台 Service 设置为前台 Service,使进程的优先级由4提升为2,从而使进程的优先级仅仅低于用户当前正在交互的进程,与可见进程优先级一致,使进程被杀死的概率大大降低。

方案实现挑战:从 Android2.3 开始调用 setForeground 将后台 Service 设置为前台 Service 时,必须在系统的通知栏发送一条通知,也就是前台 Service 与一条可见的通知时绑定在一起的。

对于不需要常驻通知栏的应用来说,该方案虽好,但却是用户感知的,无法直接使用。

方案挑战应对措施:通过实现一个内部 Service,在 LiveService 和其内部 Service 中同时发送具有相同 ID 的 Notification,然后将内部 Service 结束掉。随着内部 Service 的结束,Notification 将会消失,但系统优先级依然保持为2。

如果API<18,则可以启用sevice传入Notification(),如果API>18,则创建内部类InterService,类里面有 Notification,开启一个Notification,再在内部类中开启一个Notification,随后将InterService 关掉,此时不会有通知栏但是还有一个Notification在运行,进程不易被Kill

 

方法3 进程死后拉活的方案

方案适用范围:适用于全部 Android 平台。但存在如下几个缺点:

  1. 广播接收器被管理软件、系统软件通过“自启管理”等功能禁用的场景无法接收到广播,从而无法自启。

  2. 系统广播事件不可控,只能保证发生事件时拉活进程,但无法保证进程挂掉后立即拉活。

因此,该方案主要作为备用手段。

 

利用系统Service机制拉活

方案设计思想:将 Service 设置为 START_STICKY,利用系统机制在 Service 挂掉后自动拉活

  1. Service 第一次被异常杀死后会在5秒内重启,第二次被杀死会在10秒内重启,第三次会在20秒内重启,一旦在短时间内 Service 被杀死达到5次,则系统不再拉起。

  2. 进程被取得 Root 权限的管理工具或系统工具通过 forestop 停止掉,无法重启。

你可能感兴趣的:(Android)