Android进程保活

一,背景

 
Android系统在APP退出后台时系统并不会真正杀掉这个进程,而是将其缓存起来以方便下次能快速启用。在系统内存不足的情况下,系统会依据一套Low Memory Killer机制来杀进程。
 
Linux内核会为每一个进程分配一个值,如下,这个值代表进程的优先级,值越大,代表进程优先级越低,那么就越容易被回收,Low Memory Killer就是根据这套机制来决定哪个进程被回收
 
 
 
普通进程的oom_adj >= 0
系统的进程的oom_adj有可能<0
 
上面是简单的原理介绍,关于更细的可以参考文章  http://www.atatech.org/articles/54730

二,实施方案

 
下面重点介绍下对于进程保活,我们可以有哪些手段,这里主要从2个层面进行介绍:
 

1,Linux层面

 
Linux本身存在am命令,可以通过am命令启动Android中的Activity, Service, BroadcastReceiver等组件
 
如: am start -a android.intent.action.VIEW -d http://www.baidu.com 
 
        am startservice - a com.xxx.test
 
具体见 am --help
 
因此可以利用它在后台起一个守护进程,然后监听前台service,拉起service等
 

2,Android层面

 
1),优先级
Service中利用startForeground将服务设置为前台,当系统资源紧张时,会优先保留此服务所在的进程。
但 sdk < 18 , 直接调用startForeground即可
sdk >=18 的,会在通知栏显示service正在运行,这里不要让用户感知,所以这里的实现方式是利用2个同进程的service,利用相同的notificationID, 2个service分别startForeground,然后只在1个service里stopForeground,这样即可去掉通知栏的显示。
 
2)属性
android:persistent,适用于放在 /system/app下的APP (一般属于预装应用)
 
3)返回值
Service 中的onStartCommand方法返回值:
 
START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
 
START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
 
4)广播监听拉起
 
A,监听系统事件广播拉起对应的service
B,监听android.intent.action.ACTION_TIME_TICK广播拉起,注:不能在AndroidManifest注册,只能通过代码注册
 
5)自身销毁拉起
 
Service的onDestroy方法中调起
 
6)矩阵互保
 
通过AIDL的方式拉起对应的service
 
7)利用AlarmManager, WakeLock 间隔性唤醒进程,但需要考虑耗电情况
  
注:每个事情有利就会有弊,千万不要以为我们进程存活越久就越好,需要根据业务,场景等综合来评定。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值