作者:朱博
android系统会尝试去维护一个应用进程达到其尽可能长的生命周期,但是在系统内存过低时它会移除一些老的进程。android系统会根据进程所含有的组件以它们的状态,把这些进程划分“重要性等级”,并根据等级决定哪些进程应该被保留哪些应该被杀死。低重要性的进程会被优先淘汰,之后按等级依次进行处理。重要性划分为5个级别:
1. 前景进程:正在与用户交互的进程。
如果一个进程包含以下条件可以认为是一个前景进程:
- 它正在运行一个与用户进行交互的Activity(Activity对象的onResume()方法被调用)。
- 它含有一个service绑定在与用户进行交互的activity上。
- 它含有一个正在执行其生命周期方法的service(onCreate(), onStart(), 或者OnDestroy)
- 它含有一个正在执行其onReceiver()方法的BroadcastReceiver对象。
2. 可视进程:没有任何前景组件,但是仍然可以影响屏幕上内容的进程。
如果一个进程包含以下条件可以被认为是一个可视进程:
- 它含有一个不在前景但仍然可视的Activity(Activity对象的OnPause()方法被调用),比如一个对话遮盖在当前的activity上。
- 它含有一个service绑定在可视的activity上。
3. 服务进程:含有一个正在运行的service。
尽管它没有直接与用户进行交互,但是它处理的是用户所关心的事情(例如在后台播放Mp3或者下载数据),所以
在前景和可视进程内存充足的情况下,系统会保持它运行。
4. 后台进程:含有当前不再可视的Activity(Activity对象的onStop()方法被调用)。
这些进程无法对用户体验造成直接的影响,所以当前景进程,可视进程或服务进程需要内存时它们可能会被杀死。所以它们维护了一个(最近使用)列表来保证最近被用户使用的进程最后被杀死。
5. 空进程:不含有任何活动状态组件的进程。
这个级别进程存在的意义是充当缓冲,以减少下次启动或返回时所需的时间。系统经常会杀死这些进程以维护整个系统资源的平衡。
android根据进程所含活动状态组件的重要性,尽可能的提高其级别。
另外,一个进程的级别会受到其它依赖于它的进程的影响而提高,一个进程为其它进程提供服务,那么它的级别不会低于被服务的的进程。
例如,如果一个在进程A的content provider为一个在进程B的客户端提供服务,或者一个在进程A的service绑定在一个在进程B的组件上,那么进程A的重要性至少与进程B相同。
因为服务进程的级别要高于后台进程,所以在处理一个耗时操作时开启一个服务要比使用子线程更好,尤其是当这个操作在Activity的生命周期之外。这也是broadcast receiver 在处理耗时操作时使用service而不用子线程的原因。