一个常见的进程生命周期漏洞的例子是Intent Receiver,当Intent Receiver在方法onReceiver()中接收到一个Intent时会启动一个线程,然后返回。一旦返回,系统将认为Intent Receiver不再处于活动状态,因为Intent Receiver所在的进程也就不再有用了,除非在该进程中还有其他的组件处于活动状态。
因此,系统可能会在任意时刻终止该进程,以回收占有的内存,这样在进程中创建出的那个线程也将被终止。
解决这个问题的方法是从Intent Receiver中启动一个服务,让系统知道在进程中还有处于活动状态的工作。
为了使系统能够正确决定在内存不足时应该终止哪个进程,Android根据每个进程中运行的组件及组件的状态把进程放进一个“Important Hierarchy(重要性分级)”中,在其中进程的类型是按照重要程度排序的。
1、前台程序(Foreground)
最前面的。
它的onResume()被调用。
2、可见程序(Visible)
比如一个对话框下面的那个活动就是可见程序。
它的onPause()被调用。
3、服务进程(Service)
用户不可见服务进程,系统一直运行服务,除非内存不足以维持所有的前台进程和可见进程。
startService()方法调用。
4、后台进程(Background)
用户看不到的活动。
它的onStop()被调用。
5、空进程(Empty)
它是不拥有任何活动的应用程序组件的进程。保留这种进程的唯一原因是在下次应用程序的某个组件需要运行时,不需要重新创建进程,这样可以提高启动速度。系统将以进程中当前处于活动状态组件的重要程度为基础对进程进行分类。进程的优先级可能也会根据该进程与其他进程的依赖关系而增长。
例如:如果进程A通过在进程B中设置Context.BIND_AUTO_CREATE标记或使用ContentProvider被绑定到一个服务,那么进程B在分类时至少要被堪称与进程A同等重要。