当前位置:   article > 正文

Android进程保活_android.intent.action.time_tick 保活监听

android.intent.action.time_tick 保活监听

一,背景

 
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 间隔性唤醒进程,但需要考虑耗电情况
  
注:每个事情有利就会有弊,千万不要以为我们进程存活越久就越好,需要根据业务,场景等综合来评定。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/235744
推荐阅读
相关标签
  

闽ICP备14008679号