服务及其生命周期

文章仅做个人笔记使用:

按重要性分:

  • 前台进程:
    1. 它正在用户的互动屏幕上运行一个Activity其 onResume()方法已被调用。
    2. 它有一个BroadcastReceiver目前正在运行其BroadcastReceiver.onReceive()方法正在执行。
    3. 它有一个Service目前正在执行其某个回调Service.onCreate()、Service.onStart() 或Service.onDestroy()中的代码。
  • 可见进程:正在进行用户当前知晓的任务,因此终止该进程会对用户体验造成明显的负面影响。
    1. 它正在运行的Activity在屏幕上对用户可见,但不在前台其 onPause()。举例来说,如果前台 Activity 显示为一个对话框,而这个对话框允许在其后面看到上一个 Activity,则可能会出现这种情况。
    2. 它有一个Service正在通过Service.startForeground()要求系统将该服务视为用户知晓或基本上对用户可见的服务作为前台服务运行。
    3. 系统正在使用其托管的服务实现用户知晓的特定功能,例如动态壁纸、输入法服务等。
  • 服务进程:
    1. 包含一个已使用startService()方法启动的Service。虽然用户无法直接看到这些进程,但它们通常正在执行用户关心的任务(例如后台网络数据上传或下载),因此系统会始终使此类进程保持运行,除非没有足够的内存来保留所有前台和可见进程。
    2. 已经运行了很长时间(例如 30 分钟或更长时间)的服务的重要性可能会降位,以使其进程降至下文所述的缓存 LRU 列表。这有助于避免超长时间运行的服务因内存泄露或其他问题占用大量内存,进而妨碍系统有效利用缓存进程。
  • 缓存进程:
    1. 目前不需要的进程,因此,如果其他地方需要内存,系统可以根据需要自由地终止该进程。在正常运行的系统中,这些是内存管理中涉及的唯一进程:运行良好的系统将始终有多个缓存进程可用(为了更高效地切换应用),并根据需要定期终止最早的进程。只有在非常危急(且具有不良影响)的情况下,系统中的所有缓存进程才会被终止,此时系统必须开始终止服务进程。

    2. 这些进程通常包含用户当前不可见的一个或多个Activity实例(onStop()方法已被调用并返回)。只要它们正确实现其 Activity,那么当系统终止此类流程时,就不会影响用户返回该应用时的体验,因为当关联的 Activity 在新的进程中重新创建时,它可以恢复之前保存的状态。

    3. 这些进程保存在伪 LRU 列表中,列表中的最后一个进程是为了回收内存而终止的第一个进程。它通常会先尝试保留更多有用的进程(比如托管用户的主屏幕应用、用户最后看到的 Activity 的进程等),再保留其他类型的进程。还可以针对终止进程应用其他政策:比如对允许的进程数量的硬限制,对进程可持续保持缓存状态的时间长短的限制等。

进程的优先级也可能因从属于进程的其他依赖项而提升。例如,如果进程 A 已通过Context.BIND_AUTO_CREATE标记绑定到Service,或在使用进程 B 中的ContentProvider,则进程 B 的分类始终至少和进程 A 一样重要。

你可能感兴趣的:(服务及其生命周期)