《建造我的Android技能塔之沙粒一:进程保活》

《建造我的Android技能塔之沙粒一:进程保活》



一、系统为什么杀死你的进程?

  • 系统出于体验和性能上的考虑,app在退到后台时,系统并不会真正的kill掉这个进程,而是将其缓存起来。
  • 打开的应用越多,后台缓存的进程越多。
  • 在系统内存不充足的情况下,系统开始根据自己的进程回收机制来判断要kill掉哪些进程,以腾出内存来给需要的app。这套杀进程回收内存的机制叫Low Memory Killer

-当内存低于 回收内存的内存阈值时,Android便会杀死对应优先级的的进程。 不同的机型内存阈值大小不同。可通过adb shell 来查看手机的内存阈值。

cat /sys/module/lowmenmorykiller/parameters/minfree

阈值的单位时4KB

进程的优先级

  • 关键优先级:前台进程
  • 高优先级:可见进程、服务进程
  • 低优先级:后台进程、空进程

空进程: 不包括任活跃何组件,只是作为缓存的形式存在,以加快进程的启动速度。

如何判断进程的优先级

通过oom_adj的值。oom_adj的值越高,进程的优先级越低。
oom_adj
图片来源:https://www.cnblogs.com/tiger-wang-ms/p/6491429.html

查看oom_adj

cat /proc/进程id/oom_adj

二、保活方式


1. 1像素保活

原理:手机关闭屏幕时,偷偷创建一个Activity,让应用成为前台进程;打开屏幕时,关闭该Activity。

实现方式:

  1. 通过广播监听屏幕开关。
  2. 创建一个1像素的Activity,将这个Activity创建在一个新的任务栈中。

缺点:存在一个Activity不够干净,同时也需要进程被杀死之前锁屏,才能有效。

2. 前台Service保活

原理:启动一个前台服务,从而提高整个应用的优先级。
缺点:需要适配, Android8.0之后 同一个id的通知只能启动一个。

3.广播拉活

  1. 系统广播拉活:在发生特定的系统事件时,系统会发出广播,通过在AndroidManifest中静态注册对应的广播监听器,即可在发生响应事件时拉活。但是从Android 7.0 开始,对广播进项了限制,而且在8.0更加严格。
  2. 用户广播拉活:
    全家桶拉活:有多个app在用户设备上安装,只要开启一个就可以将其他的app也拉活。比如,手机QQ、手机QQ空间等。
  3. Service系统机制拉活
    START_STICKY :如果Service进程被kill掉,保留Service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service。由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(intent,int ,int)方法。如果在此期间没有启动命令被传递到service,那么参数Intent将为Null;(但是某些系统不会拉活,并且当service第一次被异常杀死后很快会重启,第二次比第一次慢一些,短时间内被杀死4-5次,系统则不在拉活。

4. 账户同步拉活

原理:系统每隔一段时间会进行一次同步,同步时进行拉活。
实现:
1. 创建service 返回给系统AccountAuthenticator的binder对象,
2. 通过代码添加账户(AccountManager),
打开自动同步(AbstracThreadedSyncAdapter)。
优点:由系统进行唤醒,比较稳定。
缺点:时间不能把控。

5.jobSchedule拉活

原理:JobSchedule允许在特定状态与特定时间间隔周期执行任务。可以利用它的这个特点完成保活功能,效果即开启一个定时器,与普通定时器不同的是其调度由系统完成。(在某些ROM可能达不到需要的效果)
实现:
继承JobService,实现onstartJob,onStop方法。
JobScheduler jobScheduler = (JobScheduler ) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo.builder builder = new JobInfo.Builder(2,new ComponentName(context.getPackageName(),MyJobService.class.getName())).setPersisted(true);
builder.setPeriodic(1000);
jobScheduler .scedule(builder.build());

总结

这里只是简单记下了 进程保活相关的一些理论,并没有实际去敲demo。

以上内容如果有不准确的地方,或者需要补充的地方,还希望诸位大佬不吝赐教!
十分感谢!

《建造我的Android技能塔》开篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值