Android进程的生命周期

Android系统想要永久的保留一个应用进程差点儿是不可能的。所以系统就须要不断的释放老的或者不太重要的进程以便腾出足够的内存空间来执行新的或者更重要的进程,那么系统怎样决定哪个进程应该保留哪个应该杀死呢,原来系统会依据进程中执行组件以及他们的状态列出一个“重要层级”。当内存出现紧张的时候。系统会首先杀死最不重要的进程,接着是第二个。第三个。

。。以此类推来不断的释放系统资源直到内存不再紧张为止。

依据这个重要层级系统把进程分为了5个级别。以下要说的就是这五种不同的进程类型:

1、foreground process

此进程类型须要知道用户当前正在做什么,满足一下随意条件就可以觉得是foreground process:

    (1)正处于activity resume状态
    (2)正处于bound服务交互的状态
    (3)正处于服务在前台执行的状态(StartForeGround()被调用)
    (4)Service生命周期正在被执行(onCreate()。onStart(),onDestroy())
    (5)BroadcastReceiver正在执行onReceive()方法

杀死foreground须要用户响应。由于这个安全优先级是最高的是用户操作所必须的,任一时间下,仅有少数进程会处于前台。仅当内存实在无法供给它们维持同一时候执行时才会被杀死。一般来说。在这样的情况下。设备依旧处于使用虚拟内存的状态,必须要杀死一些前台进程以用户界面保持响应。

Android会依据进程中当前活跃组件的重要程度来尽可能高的估量一个进程的级别。

比方说。假设一个进程中同一时候有一个服务和一个可视的activity,则进程会被判定为可视进程,而不是服务进程。

2、visible process

   (1)activity不在前端显示,但也没有全然隐藏,能够看得见,比方弹出一个对话框
   (2)一个bound到visible或者foreground的activity的service

没有前台组件,但仍可被用户在屏幕上所见。

当满足例如以下任一条件时。进程被觉得是可视的:

• 它包括着一个不在前台,但仍然为用户可见的activity(它的onPause()方法被调用)。这样的情况可能出如今以下情况:比方说,前台activity是一个对话框,而之前的activity位于其下并能够看到。


• 它包括了一个绑定至一个可视的activity的服务。
可视进程依旧被视为是非常重要的。非到不杀死它们便无法维持前台进程执行时,才会被杀死。

3、Service process

    正在执行的,不在上述两种状态的service。

是由 startService() 方法启动的服务,它不会变成上述两类。虽然服务进程不会直接为用户所见,但它们一般都在做着用户所关心的事情(比方在后台播放mp3或者从网上下载东 西)。

所以系统会尽量维持它们的执行,除非系统内存不足以维持前台进程和可视进程的执行须要。

4、background process

不可见状态的activity进程,onstop被调用。

包括眼下不为用户所见的activity(Activity对象的 onStop() 方法已被调用)。这些进程与用户体验没有直接的联系。能够在随意时间被杀死以回收内存供前台进程、可视进程以及服务进程使用。

一般来说,会有非常多背景进程 执行。所以它们一般存放于一个LRU(最后使用)列表中以确保最后被用户使用的activity最后被杀死。假设一个activity正确的实现了生命周 期方法,并捕获了正确的状态,则杀死它的进程对用户体验不会有不论什么不良影响。

5、empty process

没有执行不论什么component的进程。保留这个进程主要是为了缓存的须要

不包括不论什么活动应用程序组件。

这样的进程存在的唯一原因是做为缓存以改善组件再次于当中执行时的启动时间。系统常常会杀死这样的进程以保持进程缓存和系统内核缓存之间的平衡。


此外。一个进程的级别可能会由于其他进程依赖于它而升高。一个为其他进程提供 服务的进程级别永远高于使用它服务的进程。比方说,假设A进程中的内容提供者为进程B中的client提供服务。或进程A中的服务为进程B中的组件所绑定。则A 进程最低也会被视为与进程B拥有相同的重要性。

原文地址:https://www.cnblogs.com/ldxsuanfa/p/10050678.html