进程保活
让应用长期存活于系统中,即使被杀死了,也可以通过一定手段自动拉活。 例如手机定位、Push等
Android进程的优先级
1、Foreground process 前台进程 2、Visible process 可见进程 3、Service process 服务进程 例如:音乐播放 4、Background process 后台进程(随时会被杀死) 5、Empty process 空进程(随时会被杀死) 用于缓存,缩短下次启动的时间
Android进程的回收策略
Low memory killer 通过OOM_ODJ(判断进程的优先级)评分机制,对进程进行打分,然后将分数高的进程判定为bad进程,杀死并释放内存
利用系统广播拉活
在触发系统事件的时候,会发出相应的广播,我们可以在Manifest中静态注册广播接受者来监听这个广播,(例如开机、网络变化) 缺点:
广播接受者被管理软件或者系统软件通过自启动管理等禁用的情况下是无法进行自启动的。 系统广播事件是不可控制的,只有在发生事件的时候才能执行拉活,无法保证进行被杀死后及时拉活。
利用系统Service机制拉活
@Override
public int onStartCommand ( Intent intent, int flags, int startId) {
return START_STICKY;
}
在Service中有个onStartCommand回调方法,将其返回值设置成START_STICKY,当Service因为系统内存不足被杀掉后,在未来某个时间内,当系统内存充足时会尝试重建这个Service,然后重新回调onStartCommand方法。 缺点:
仅当系统内存不足被杀死的情况下。 第一次拉活在5秒内,第二次在10秒内,第三次在20秒内。短时间内多次被杀死后不会进行拉活。
利用Native进程拉活
利用Linux系统中Fork机制创建一个Native进程,在Native进程中监控主进程,一旦主进程挂掉及时重建。AMS机制来管理。 如何监听:
创建一个循环监听器。轮询耗性能。 创建一个监控文件,在主进程中持有锁,Native进程对该文件的访问被阻塞,一旦成功获取到锁,则代表主进程被杀死,执行拉活。 缺点:
Android 5.0 之后系统对Native进程加强了管理,所以Native拉活的方案是失效的。
利用JobScheduler机制拉活