【Android】の基础——进程优先级

时间:2020-12-12 20:06:43

系统根据在进程中在运行的组件及组件的状态,为每一个进程分配了一个优先级等级。优先级最低的进程首先被杀死。这个进程重要性的层次结构主要有五个等级。

五个进程等级

1.前台进程(Foreground process)

是前台进程的三种情况:

  1. 进程持有一个正在与用户交互的Activity。
  2. 进程持有一个Service,这个Service处于这几种状态:

    • Service与用户正在交互的Activity绑定。
    • Service是在前台运行的,即它调用了 startForeground()。
    • Service正在执行它的生命周期回调函数(onCreate(), onStart(), or onDestroy())。
  3. 进程持有一个BroadcastReceiver,这个BroadcastReceiver正在执行它的 onReceive() 方法。

2.可见进程(Visible process)

如果一个进程不含有任何前台的组件,但仍可被用户在屏幕上所见。当满足如下任一条件时,进程被认为是可见的:

  1. 进程持有一个Activity,这个Activity不在前台,但是仍然被用户可见(处于onPause()调用后又没有调用onStop()的状态,比如,前台的activity打开了一个对话框,这样activity就会在其后可见)。
  2. 进程持有一个Service,这个Service和一个可见的(或者前台的)Activity绑定。

可见的进程除非是为了保证所有前台进程的运行而不得不杀死,一般不会被销毁。

3.服务进程 (Service process)

如果一个进程中运行着一个service,这个service是通过 startService() 开启的,并且不属于上面两种较高优先级的情况,这个进程就是一个服务进程。

尽管服务进程没有和用户可以看到的东西绑定,但是它们一般在做的事情是用户关心的,比如后台播放音乐,后台下载数据等。所以系统会尽量维持它们的运行,除非系统内存不足以维持前台进程和可见进程的运行需要。

4.后台进程 (Background process)

如果进程不属于上面三种情况,但是进程持有一个用户不可见的activity(activity的onStop()被调用,但是onDestroy()没有调用的状态),就认为进程是一个后台进程。

后台进程不直接影响用户体验,系统会为了前台进程、可见进程、服务进程而任意杀死后台进程。

通常会有很多个后台进程存在,它们会被保存在一个LRU (least recently used)列表中,这样就可以确保用户最近使用的activity最后被销毁,即最先销毁时间最远的activity。

5.空进程

如果一个进程不包含任何活跃的应用组件,则认为是空进程。
例如:一个进程当中已经没有数据在运行了,但是内存当中还为这个应用驻留了一个进程空间。
保存这种进程的唯一理由是为了缓存的需要,为了加快下次要启动这个进程中的组件时的启动时间。系统为了平衡进程缓存和底层内核缓存的资源,经常会杀死空进程。

如何避免后台进程被杀死:

  1. 调用startForegound,让你的Service所在的线程成为前台进程
  2. Service的onStartCommond返回START_STICKY或START_REDELIVER_INTENT
  3. Service的onDestroy里面重新启动自己