对于程序被杀死,一般我们能做到两个方面优化:
- 保证进程的优先级
- 当进程被杀死之后的唤醒
保证进程的优先级
进程的优先级
进程根据优先级区分可以分为
- 前台进程
- 可见进程
- 服务进程
- 后台进程
- 空进程
进程中有个较为具体的值oom_adj,其数值越小对应的优先级越高
红色部分是易于被回收的(4-16),绿色部分是不易被回收的(0-4),白色部分则是不会被回收的( -0)。
进程被回收的场景:
app按home键处于后台长时间后,由于内存不足会被kill
可以给app运行一个service,然后通过Service.startForeground() 将service提升为前台服务,这样oom_adj的数值将由4降到1锁屏状态一段时间之后,省电机制会kill进程
注册一个监听锁屏开屏的广播,当锁屏之后开启一个1像素的透明activity的,可以将oom_adj提升到0,,再当开屏的时候销毁这个activity用户手动释放内存
唯一的方法就是加入手机rom白名单
当进程被杀死之后的唤醒
分两种情况一种是有activity没有service,当没有内存的时候被杀死,打开activity的时候会重新打开之前的activity,另一种是带有service的后台进程被kill,可以通过service自带的api唤醒service
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//.....
return START_STICKY; // service被异常停止后,系统尝试重启service,不能保证100%重启成功
}