Android 进程和应用生命周期

默认情况下,每个 Android 应用就是 Linux 的一个进程。当需要运行应用的一些代码时,系统会为应用创建此进程,并使其保持运行,直到不再需要它且系统需要回收其内存以供其他应用使用。

为了确定在内存不足时系统应该回收哪些进程,Android 会根据每个进程中运行的组件以及这些组件的状态,将进程按重要性分为以下几种进程:

  • 前台进程是用户目前执行操作所需的进程。在不同的情况下,进程可能会因为其所包含的各种应用组件而被视为前台进程。如果以下任一条件成立,则进程会被认为位于前台:

    • 它正在用户的互动屏幕上运行一个 Activity 其 onResume() 方法已被调用。
    • 它有一个 BroadcastReceiver 目前正在运行(其 onReceive() 方法 正在执行)
    • 它有一个 Service 目前正在执行某个回调(onCreate() 方法、onStartCommand() 方法或者 onDestroy() 方法)。

    系统中只有少数此类进程,而且除非内存过低,导致连这些进程都无法进行,才会在最后一步终止这些进程。

  • 可见进程正在运行用户当前知晓的任务,因此终止该进程会对用户体验造成明显的负面影响,在以下条件中,进程将视可见:

    • 它正在运行的 Activity 在屏幕上对用户可见,但不在前台(其 onPause() 方法已被调用)。举例来说,如果前台 Activity 显示为一个对话框,而这个对话框允许在其后买你看到上一个 Activity,则可能会出现这种情况。
    • 它有一个 Service 正在通过 startForeground() 作为前台服务运行。
    • 系统正在使用托管的服务实现用户知晓的特定功能,例如动态壁纸、输入法服务等。

    相比前台进程,系统中运行的这些进程数量较不受限制,但仍相对受控。这些进程被认为非常重要,除非系统为了使所有前台进程保持运行而需要终止它们,否则不会这么做。

  • 服务进程包含一个已使用 startService() 方法启动的 Service。虽然用户无法直接看到这些进程,但它们通常正在执行用户关心的任务(例如后台网络数据上传或下载),因此系统会始终使此类进程保持运行,除非没有足够的内存来保留所有前台和可见进程。已经运行了很长时间(例如 30 分钟 或更长时间)的服务的重要性可能会降 位,以使其进程降至下文所述的缓存 LRU 列表。这有助于避免超长时间运行的服务因内存泄漏或其他问题占用大量内存,进而妨碍系统有效利用缓存进程。

  • 缓存进程使目前不需要的进程,因此,如果其他地方需要内存,系统可以根据需要自由地终止该进程。在正常运行的系统中,这些事内存管理中涉及的唯一进程:运行良好的系统将始终有多个缓存进程可用(为了更高效地切换应用),并根据需要定期终止最早的进程。只有在非常危急(且具有不良影响)的情况下,系统中的所有缓存进程才会被终止,此时系统必须开始终止服务进程。
    这些进程通常包含用户当前不可见的一个或多个 Activity 实例(onStop() 方法已被调用并返回)。只要它们正确实现其 Activity 生命周期,那么当系统终止此类流程时,就不会影响用户返回该应用时的体验,因为当关联的 Activity 在新的进程中重新创建时,它可以恢复之前保存的状态。
    这些进程保存在伪 LRU 列表中,列表中的最后一个进程时为了回收内存而终止的第一个进程。此列表的确切排序政策时平台的实现细节,但它通常会先尝试保留更多有用的进程(比如托管用户的主屏幕应用、用户最后看到的 Activity 的进程等),再保留其他类型的进程。还可以针对终止进程应用其他政策:比如对允许的进程数量的硬限制,对进程可持续保持缓存状态的时间长短的限制等。

你可能感兴趣的:(Android 进程和应用生命周期)