Android 系统为了保持系统运行流畅,在内存吃紧的情况下,会将一些进程 kill,以释放一部分内存。然而,对于一些(如:IM-QQ 、微信,支付-支付宝等)比较重要、我们希望能及时收到消息的 APP ,需要保持进程持续活跃,那么就需要实施一些保活措施来保证进程能够持续存活,即Android 进程保活
。
Android 进程保活,一般从两个方面进行:
- 运行中保活:提高进程优先级,降低被系统 kill 的概率
- 被 kill 后拉活:被系统 kill 后,将进程拉活(重启)
在此之前,我们先来了解下 Android 进程的一些相关概念。
进程
默认情况下,同一 APP 的所有组件均运行在相同的进程中,但是也可以根据需要,通过在清单文件中配置来控制某些组件的所属进程。
内存不足的情况下,Android 系统会选择 kill 某一进程来释放该进程占用的内存,供其它为用户提供更为紧急服务的进程使用。在被关闭的进程中运行的组件也会随着进程的关闭而销毁。
决定 kill 哪个进程时,Android 系统将权衡所有进程对用户的相对重要程度。例如:相对于托管可见 Activity 的进程而言,更有可能 kill 托管不可见 Activity 的进程。因此,是否终止 kill 某个进程取决于该进程中所运行组件的状态。
Android 进程的生命周期
Android 系统会尽量长时间地保持 APP 进程的运行,但为了新建进程或者运行更重要的进程,最终要 kill 旧进程来回收内存。为了确定保留或者 kill 哪些进程,系统会根据进程中正在运行组件的状态,将每个进程放入重要性层次结构
中,必要时,系统会首先kill重要性最低的进程,其次kill重要性略低的进程,以此类推。
重要性层次结构
一共有5级。以下列表按照重要程度列出了各类进程(第一类进程最重要,将是最后一类被终止的进程):
1. 前台进程
用户当前操作的进程。一个进程满足以下任一条件 ,即视为前台进程:
- 托管用户正在交互的 Activity(已调用 onResume() 方法)。
- 托管某个 Service ,且 Service 绑定到用户正在交互的 Activity。
- 托管正在“前台”运行的 Service(服务已调用startForeground())。