Android中进程生命周期的优先级
学习Android最好的途径当然是强大的官方文档了,其中在ProcessesandThreads一节中对于进程生命周期淘汰优先级,有着详细的介绍。就不给大家转帖了,直接放译文吧,如下:
Android系统会尽量维持进程的存在,但毕竟资源有限,当系统资源告急的时候会淘汰一部分进程。淘汰顺序的凭据就是系统进程的优先级了,优先级越高越不容易被杀死,反之亦然。系统总共为进程分了五个优先级,如下
一、前台进程(进程满足如下任一条件即为前台进程):
1.拥有一个执行了onresume方法正在与用户交互(获得焦点)的Activity
2.拥有一个service,这个Service跟正在与用户交互的Activity进行了绑定
3.拥有一个Service,这个Service调用了startForeground()方法
4.拥有一个正在执行onCreate()、onStart()或者onDestroy()方法中的任意一个的Service
5.拥有一个正在执行onReceive方法的BroadcastReceiver
二、可见进程:
1.拥有一个执行了onPause方法,但仍然可见的Activity
2.拥有一个Service,这个Service跟一个可见的或前台的Activity绑定了
三、服务进程:
拥有一个通过startService方法启动的Service的进程
四、后台进程:
拥有一个后台Activity(onStop方法被调用)的进程
五、空进程:
没有拥有任何活动的应用组件的进程,也就是没有任何Service和Activity在运行
另外,还有一些需要补充的,当一个进程满足多个进程条件时,当然是取优先级更高的为准,比如一个进程同时满足前台进程和服务进程的条件,这个进程就是个前台进程,这点很好理解。另外,进程的优先级也不是一成不变的,而且有时候会随着一些相关的因素而发生改变;比如,某进程A满足前台进程的第二个条件,进程A拥有一个service,这个Service跟正在与用户交互的Activity进行了绑定;当这个Activity变成可见状态了,进程A便不再满足前台进程的条件,进而因满足可见进程的第二个条件,进程A变成了可见进程。总之,在掌握了基本概念之后,需要细心的分析具体的情况,方能得出正确的判断。
进程优先级的额外说明
1.系统会赋予进程尽可能高的优先级.例如一个进程既包含已启动的service,也包含前台activity,则这个进程会被视为前台进程.
2.由于组件之间的依赖性,进程的优先级有可能被提高.假如进程A服务于进程B,则进程A的优先级不能低于进程B.比如,进程A的ContentProvider组件正在服务于进程B的某个组件,或者进程A的service组件和进程B的某个组件绑定等,这些情况下,进程A的优先级都不会低于进程B(如果按照优先级规则,进程A的优先级确实低于进程B,则系统会选择提高进程A的优先级到和进程B相同).
3.由于服务进程的优先级高于后台进程,因此如果activity需要执行耗时操作,最好还是启动一个service来完成.当然,在activity中启动子线程完成耗时操作也可以,但是这样做的缺点在于,一旦activity不再可见,activity所在的进程成为后台进程,而内存不足时后台进程随时都有可能被系统杀死(但是启动service完成耗时操作会带来数据交互的问题,比如耗时操作需要实时更新UI控件的状态的话,service就不是一个好的选择).基于同样的考虑,在BroadcastReceiver中也不应该执行耗时操作,而应该启动service来完成(当然,BroadcastReceiver的生命周期过于短暂,也决定了不能在其中执行耗时操作).