Android进程保活的问题

Posted 呼啸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android进程保活的问题相关的知识,希望对你有一定的参考价值。

从以下三个方面来聊一聊

1.android进程的优先级

2.android进程的回收策略

3.进程的保活方案

进程保活的概念一直是非常热门的。进程保活是什么概念,就是说,想要我们的进程在系统中永远存在,也就是说你系统想杀怎么都杀不死。就算你给我杀死了,我仍然有办法给他保活起来。这其实不是一种流氓手段。因为很多时候,你想为用户提供服务,就必须有一个进程常驻着。在特定时间内做一些事情。比如说在安卓当中的一些广播接收者,他不支持静态注册。也就是说,比如屏幕开关的广播,必须要在进程中动态注册。比如一些IM,推送的,需要在后台维护一个长的连接。以便在最及时的时间内将信息传达给用户。这些都需要进程保活。进程保活是一个很重要的概念。

但是,进程保活在内存,该怎么去优化他呢。因为或多或少都会增加一些性能开销。

所有我们还是要在进程保活和内存消耗这两者之间找一个平衡点。

我们先了解下进程是怎么死的。

1方面是人为的kill掉

2.可能被第三方的应用给干死了。比如说像安全的软件。手机管家之类的。

3.系统杀死

接下来看看android的进程优先级。

1.前台进程

用户当前操作,所在的进程。通常情况下,在一个时间内,前台进程是不多的,只有系统内存在不足以支撑他们的时候,系统才会杀死他们。比如说我们正在和用户交互的activity.还有在前台运行的service(调用了startforegroundservice这个方法)。他可以和正在前台的activity进行交互。

还有在广播接收者里的onresume方法里,他也是前台进程。

2.可见进程

没有任何前台组件,但是他仍会影响用户在屏幕可见内容的进程。系统为了维持前台进程。如果在内存不够了,可能回收可见进程。否则系统一般不会回收可见进程。

3.服务进程

比如后台网络获取数据。比如后台播放音乐。比如后台进行一些计算啊等等。在内存不足以维持前台进程,可见进程的时候,系统会让服务进程回收。其他情况下,service process都是会保持运行状态的。

4.后台进程

他的优先级最低,系统可以随时终止他。用来回收内存来供给上面三个进程使用。

5.空进程。

保留这个进程的唯一目的就是做缓存。以缩短下次组件启动所需要的时间。

为了使系统总体的内存在用户进程和底层之间保持平衡,系统往往会终止这个空进程。

其中,前台进程,可见进程,服务进程,系统在内存够的时候,是不会回收这三个进程的。而后台进程和空进程,系统回收他们是比较随意的。用来给前面三个进程提供内存。

上面就是android中的进程优先级。

我们来看第二部分

android进程的回收策略:

1.Low Memory killer :通过一些比较复杂的评分机制(判断oom_odj的阈值,阈值越低,说明优先级越高),对进程进行打分,然后将分数高的进程判定为bad进程,杀死并释放内存。

这个是定时进行检查的。

2.oom_odj是判断进程的优先级。

上面是android进程的回收策略。接下来我们来看重头戏,android进程的保活方案

1.利用系统广播进行拉活

系统在发生一些事情的时候,会发出一些系统广播。我们可以在manifest.xml来注册这个广播接收器。

但是这个方案有缺陷,比如,被360给禁止。而系统广播是有时候才会发生。

2.利用系统service进行拉活。

利用系统service在内存不足被杀死后,在系统内存够的时候会尝试创建这个service.

一旦创建成功后,他又会回到onstartcomannd这个方法。

3.利用Native进程进行拉活

android5.0之后是失效的。

4.利用JobScheduler机制进行拉活

监听主进程的存活,拉活主进程

5.利用账号同步机制进行拉活

以上是关于Android进程保活的问题的主要内容,如果未能解决你的问题,请参考以下文章

Android5.0以上app进程保活的正确姿势

Android 进程保活

Android 进程保活

Android进程保活全攻略(上)

Android中的保活机制

iOS 子线程用runloop保活的一个方案