Android进程保活方案整理

770 阅读4分钟

迄今出现过的进程保活方案整理记录。

标题核心点可行性
Activity提权(1像素Activity)锁屏广播监听唤醒、Activity优先级较高
广播拉活监听系统广播实现拉活Android7.0+对广播做了限制,8.0后更严格
Service提权startForeground开启前台服务Android8.0以后需在通知栏显示一条通知
推送拉活推送消息,点击通知栏拉活服务
JobScheduler拉活Android5.0引入的一种特殊任务调度机制,允许在特定状态与特定时间间隔周期执行任务,调度由系统完成Android8.0后失效
双进程守护两个进程相互唤醒(本地服务绑定远程服务,并播放无声音乐)Android5.0后失效
账户同步拉活
手机设置白名单、自启动、省电策略无限制等
Service机制(Sticky)拉活START_STICKY
Native拉活高版本基本无效
“全家桶”拉活多个app生态

1. Activity提权(1像素Activity)

原理:监控手机锁屏解锁事件,在屏幕锁屏时启动1个像素透明的 Activity,
在用户解锁时将 Activity 销毁掉,从而达到提高进程优先级的作用。 示例代码: Gitee: ServiceDaemon

2. Service机制(Sticky)拉活

将 Service 设置为 START_STICKY,利用系统机制在 Service 挂掉后自动拉活.

如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。 随后系统会尝试重新创建service,由于服务状态为开始状态, 所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。 如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。

只要 targetSdkVersion 不小于5,就默认是 START_STICKY。 但是某些ROM 系统不会拉活。

并且经过测试,Service 第一次被异常杀死后很快被重启, 第二次会比第一次慢,第三次又会比前一次慢, 一旦在短时间内 Service 被杀死4-5次,则系统不再拉起。

3. Native拉活

博文 Android 进程常驻(3)----native保活5.0以下方案推演过程以及代码详述
源码 Github:MarsDaemon
高版本基本不可用

4. “全家桶”拉活

有多个app在用户设备上安装,只要开启其中一个就可以将其他的app也拉活。
比如手机里装了百度、百度网盘、百度钱包等等,那么打开任意一个app后,其他的app也都会被唤醒。
然而我们小厂的应用很难做到一个用户手机里面安装我们的多常用个应用

5. 广播拉活

在发生特定系统事件时,系统会发出广播,通过在 AndroidManifest 中静态注册对应的广播监听器, 即可在发生响应事件时拉活。但是从android 7.0开始,对广播进行了限制,而且在8.0以后更加严格

目前可以注册静态广播有: ACTION_LOCKED_BOOT_COMPLETED、ACTION_BOOT_COMPLETED、 ACTION_USB_ACCESSORY_ATTACHED、ACTION_USB_ACCESSORY_DETACHED、 ACTION_USB_DEVICE_ATTACHED、ACTION_USB_DEVICE_DETACHED、 ACTION_CONNECTION_STATE_CHANGED、ACTION_CONNECTION_STATE_CHANGED、 ACTION_ACL_CONNECTED、ACTION_ACL_DISCONNECTED等

详细参见 Google Android Broadcast-Exceptions

6. Service提权

创建一个前台服务用于提高app在按下home键之后的进程优先级, 也就是使用startForeground(ID,Notification)使Service成为前台Service, 前台服务需要在通知栏显示一条通知

示例源码:Gitee ServiceDaemon FrondServiceNotification.java

误区:配置<intent-filter android:priority="1000" />提升优先级
参考developer@intent-filter-element
此属性对 Activity 和广播接收器都有意义

7. 推送拉活

根据终端不同,在小米手机(包括 MIUI)接入小米推送、华为手机接入华为推送。
当用户收到通知后,点击通知栏,进而拉活我们的服务。

小米消息推送接入文档
华为推送服务接入文档
其它手机厂商可以搜索

8. JobScheduler拉活

JobScheduler允许在特定状态与特定时间间隔周期执行任务。
可以利用它的这个特点完成保活的功能,效果即开启一个定时器,与普通定时器不同的是其调度由系统完成。

示例源码 Gitee: ServiceDaemon@MyJobService.java

9. 账户同步拉活

手机系统设置里会有“帐户”一项功能,
任何第三方APP都可以通过此功能将数据在一定时间内同步到服务器中去。
系统在将APP帐户同步时,会将未启动的APP进程拉活

示例源码Github: BasicSyncAdapter 或者Gitee: ServiceDaemon

10. 双进程守护

两个进程共同运行,如果有其中一个进程被杀,
那么另外一个进程就会将被杀的进程重新拉起
示例源码 Gitee: ServiceDaemon

11. 手机设置白名单、自启动、省电策略无限制等

依据不同手机,针对具体应用,引导用户设置,这个到了用户那,去设置的很少。。。

参考:

  1. blog.csdn.net/CSqingchen/…
  2. juejin.cn/post/735207…