在Android系统中,应用进程停止运行有以下几个原因:

1.用户主动退出;
2.Crash异常退出;
3.系统通过杀掉进程回收内存。

其中,用户主动退出是合理行为;进程发生Crash后需要重新启动应用(有些情况会自动重启)。系统通过杀掉应用进程回收内存,理论上也是合理的行为。这里我们重点分析第三种情况。

我们知道,Android有一个淘汰机制,即Android系统会根据应用的运行状态设置一个进程的优先级,然后根据系统整体内存使用状态进行调整,当内存占用达到一定阈值时,就需要把一些优先级低的进程杀掉,以保证其他进程能够有足够的内存使用。

但是杀掉应用进程会对体验有较大的影响。如再次打开应用耗时会更长(冷启动),如果能从最大程序上提高应用进程的存活率,可以提高热启动的概率,减少冷启动的概率,让用户更快进入应用。所以提高应用进程的存活率是非常有意义的。

应用进程优先级

在Android系统中,应用进程的优先级(oom_adj值)分为以下等级,不同定义的进程系统采用了不同的管理机制。oom_adj值从-17到16,oom_adj越大,进程优先级越低。


常见的五个等级为:
前台进程(FOREGROUND_APP_ADJ=0);
可见进程(PERCEPTIBLE_APP_ADJ=2);
服务进程(SERVICE_ADJ=5);
后台进程(CACHED_APP_ADJ=8);
空进程(HIDDEN_APP_MIN_ADJ=15)。


(详细的等级划分大家可以查阅其它相关资料)


当内存不足时,进程优先级低的(oom_adj越大的)、占内存大的App进程将会被优先杀掉,系统进程的规则如下:


1.进程优先级设置为PERSISTENT_PROC_ADJ(-12)被杀概率要低。
2.进程优先级HEAVY_WEIGHT_APP_ADJ(4),这种是Activity仅次于主进程,系统认为是高权重进程。
3.前台进程FORGROUND_APP_ADJ(0),前台进程,是指正在前台运行的应用,被杀概率不大。
4.进程中没有任何Activity存在会优先被杀。
5.空进程最容易被杀。


提高进程优先级进程保活

上述分析可以,可以提高进程优先级使应用在后台的存活时间更长,一般使用以下几种方法实现。

1)网络连接

通过长连接心跳和进程保持通信,使进程保持活动状态,但如果系统内存非常紧张,也有可能被杀。

2)利用系统现有机制

一般可以利用注册系统消息(AlarmReceiver,RootReceiver等),通过系统消息响应挂起进程。

3)利用SyncAdapter

利用Android系统提供的账号同步机制SyncAdapter,实现进程优先级提高。SyncAdapter是一个系统服务,通过系统的定时器更新应用程序数据ContentProvider,因为Sync服务工作在独立进程,并且由操作系统调度,进程属于核心进程级别,系统不会杀掉,而使用了SyncAdapter的进程优先级本身也会提高,从而降低应用进程被杀的概率。

4)此外,降低应用内存开销是减小进程被系统回收概率的一个非常有效的方法。

-------------------------------------------------------------------------------------------