系统根据在进程中在运行的组件及组件的状态,为每一个进程分配了一个优先级等级。优先级最低的进程首先被杀死。这个进程重要性的层次结构主要有五个等级。
五个进程等级
1.前台进程(Foreground process)
是前台进程的三种情况:
- 进程持有一个正在与用户交互的Activity。
-
进程持有一个Service,这个Service处于这几种状态:
- Service与用户正在交互的Activity绑定。
- Service是在前台运行的,即它调用了 startForeground()。
- Service正在执行它的生命周期回调函数(onCreate(), onStart(), or onDestroy())。
- 进程持有一个BroadcastReceiver,这个BroadcastReceiver正在执行它的 onReceive() 方法。
2.可见进程(Visible process)
如果一个进程不含有任何前台的组件,但仍可被用户在屏幕上所见。当满足如下任一条件时,进程被认为是可见的:
- 进程持有一个Activity,这个Activity不在前台,但是仍然被用户可见(处于onPause()调用后又没有调用onStop()的状态,比如,前台的activity打开了一个对话框,这样activity就会在其后可见)。
- 进程持有一个Service,这个Service和一个可见的(或者前台的)Activity绑定。
可见的进程除非是为了保证所有前台进程的运行而不得不杀死,一般不会被销毁。
3.服务进程 (Service process)
如果一个进程中运行着一个service,这个service是通过 startService() 开启的,并且不属于上面两种较高优先级的情况,这个进程就是一个服务进程。
尽管服务进程没有和用户可以看到的东西绑定,但是它们一般在做的事情是用户关心的,比如后台播放音乐,后台下载数据等。所以系统会尽量维持它们的运行,除非系统内存不足以维持前台进程和可见进程的运行需要。
4.后台进程 (Background process)
如果进程不属于上面三种情况,但是进程持有一个用户不可见的activity(activity的onStop()被调用,但是onDestroy()没有调用的状态),就认为进程是一个后台进程。
后台进程不直接影响用户体验,系统会为了前台进程、可见进程、服务进程而任意杀死后台进程。
通常会有很多个后台进程存在,它们会被保存在一个LRU (least recently used)列表中,这样就可以确保用户最近使用的activity最后被销毁,即最先销毁时间最远的activity。
5.空进程
如果一个进程不包含任何活跃的应用组件,则认为是空进程。
例如:一个进程当中已经没有数据在运行了,但是内存当中还为这个应用驻留了一个进程空间。
保存这种进程的唯一理由是为了缓存的需要,为了加快下次要启动这个进程中的组件时的启动时间。系统为了平衡进程缓存和底层内核缓存的资源,经常会杀死空进程。
如何避免后台进程被杀死:
- 调用startForegound,让你的Service所在的线程成为前台进程
- Service的onStartCommond返回START_STICKY或START_REDELIVER_INTENT
- Service的onDestroy里面重新启动自己