06 理解ActivityManagerService

2019/03/27 posted in  Android进阶解密

6.1 AMS家族

6.1.1 Android 7.0的AMS家族

6.1.2 Android 8.0的AMS家族

6.2 AMS的启动过程

6.3 AMS与应用程序进程

AMS与应用程序进程的关系主要有以下两点:

  • 启动应用程序时AMS会检查这个应用程序需要的应用程序进程是否存在。
  • 如果需要的应用程序进程不存在,AMS就会请求Zygote进程创建需要的应用程序进程。

6.4 AMS重要的数据结构

6.4.1 解析ActivityRecord

ActivityRecord内部记录了Activity 的所有信息,因此它用来描述一个Activity, 它是在启动Activity 时被创建的,具体是在ActivityStarter 的startActivity方法中被创建的,具体可以查看4.1.2节。ActivityRecord 的部分重要成员变量如表6一1所示。

从表中可以看出ActivityRecord的作用,其内部存储了Activity 的所有信息,包括AMS的引用、AndroidManifest 节点信息、Activity 状态、Activity 资源信息和Activity 进程相关信息等,需要注意的是其中含有该ActivityRecord 所在的TaskRecord, 这就将ActivityRecord和TaskRecord关联在一起,它们是Activity 任务栈模型的重要成员,我们接着来查看TaskRecord。

6.4.2 解析TaskRecord

从表中可以发现TaskRecord的作用,其内部存储了任务栈的所有信息,包括任务栈的唯一标识符、任务栈的倾向性、任务栈中的Activity记录和AMS的引用等,需要注意的是其中含有ActivityStack,也就是当前Activity 任务栈所归属的ActivityStack,我们接着来查看ActivityStack。


6.4.3 解析ActivityStack

ActivityStack是一个管理类,用来管理系统所有Activity的各种状态,其内部维护了TaskRecord的列表,因此从Activity任务栈这一角度来说,ActivityStack也可以理解为Activity堆栈。它由ActivityStackSupervisor来进行管理的,而ActivityStackSupervisor在AMS中的构造方法中被创建。

ActivityStack的实例类型

```
public final class ActivityStackSupervisor implements DisplayListener {
   ...
    //用来存储Launcher App的所有Activity
    ActivityStack mHomeStack;

    //表示当前正在接收输入或启动下一个Activity的所有Activity
    ActivityStack mFocusedStack; 

    //表示此前接收输入的所有Activity。
    private ActivityStack mLastFocusedStack;
    ...
}
```

ActivityState

  • ActivityStack中通过枚举存储了Activity的所有的状态:

    enum ActivityState {
           INITIALIZING,
    RESUMED,
    PAUSING,
    PAUSED,
    STOPPING,
    STOPPED,
    FINISHING,
    DESTROYING,
    DESTROYED
    }

特殊状态的Activity

  • 这些特殊的状态都是ActivityRecord类型的,ActivityRecord用来记录一个Activity的所有信息。

    ActivityRecord mPausingActivity = null;//正在暂停的Activity
    ActivityRecord mLastPausedActivity = null;//上一个已经暂停的Activity
    ActivityRecord mLastNoHistoryActivity = null;//最近一次没有历史记录的Activity
    ActivityRecord mResumedActivity = null;//已经Resume的Activity
    ActivityRecord mLastStartedActivity = null;//最近一次启动的Activity
    ActivityRecord mTranslucentActivityWaiting = null;//传递给convertToTranslucent方法的最上层的Activity

维护的ArrayList

  • ActivityStack中维护了很多ArrayList,这些ArrayList中的元素类型主要有ActivityRecord和TaskRecord,其中TaskRecord用来记录Activity的Task。

6.5 Activity栈管理

Activity栈:存储和管理Activity。

6.5.1 Activity任务栈模型

  • ActivityRecord用来记录一个Activity 的所有信息
  • TaskRecord 中包含了一个或多个ActivityRecord, TaskRecord 用来表示Activity 的任务栈,用来管理栈中的ActivityRecord
  • ActivityStack又包含了一个或多个TaskRecord,它是TaskRecord的管理者。Activity 栈管理就是建立在Activity 任务栈模型之上的

有了栈管理,我们可以对应用程序进行操作,应用可以复用自身应用中以及其他应用的Activity, 节省了资源。

6.5.2 Launch Mode

  • standerd:默认模式,每次启动Activity都会创建一个新的Activity实例。
  • singleTop:如果要启动的Activity已经在栈顶,则不会重新创建Activity,同时该Activity的onNewIntent方法会被调用。如果要启动的Activity不在栈顶,则会重新创建该Activity的实例。
  • singleTask:如果要启动的Activity已经存在于它想要归属的栈中,那么不会创建该Activity实例,将栈中位于该Activity上的所有的Activity出栈,同时该Activity的onNewIntent方法会被调用。如果要启动的Activity不存在于它想要归属的栈中,并且该栈存在,则会重新创建该Activity的实例。如果要启动的Activity想要归属的栈不存在,则首先要创建一个新栈,然后创建该Activity实例并压入到新栈中。
  • singleInstance:和singleTask基本类似,不同的是启动Activity时,首先要创建在一个新栈,然后创建该Activity实例并压入新栈中,新栈中只会存在这一个Activity实例。

6.5.3 Intent的FLAG

  • FLAG_ACTIVITY_NO_HISTORY:Activity一旦退出,就不会存在于栈中。同样的,也可以在AndroidManifest.xml中设置“android:noHistory”。
  • FLAG_ACTIVITY_MULTIPLE_TASK:需要和FLAG_ACTIVITY_NEW_TASK一同使用才有效果,系统会启动一个新的栈来容纳新启动的Activity.
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:Activity不会被放入到“最近启动的Activity”列表中。
  • FLAG_ACTIVITY_BROUGHT_TO_FRONT:这个标志位通常不是由应用程序中的代码设置的,而是Launch Mode为singleTask时,由系统自动加上的。
  • FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY:这个标志位通常不是由应用程序中的代码设置的,而是从历史记录中启动的(长按Home键调出)。
  • FLAG_ACTIVITY_CLEAR_TASK:需要和FLAG_ACTIVITY_NEW_TASK一同使用才有效果,用于清除与启动的Activity相关栈的所有其他Activity。

6.5.4 taskAffinity

我们可以在AndroidManifest.xml设置android:taskAffinity,用来指定Activity希望归属的栈, 默认情况下,同一个应用程序的所有的Activity都有着相同的taskAffinity。taskAffinity在下面两种情况时会产生效果:

  • askAffinity与FLAG_ACTIVITY_NEW_TASK或者singleTask配合。如果新启动Activity的taskAffinity和栈的taskAffinity相同(栈的taskAffinity取决于根Activity的taskAffinity)则加入到该栈中。如果不同,就会创建新栈。
  • taskAffinity与allowTaskReparenting配合。如果allowTaskReparenting为true,说明Activity具有转移的能力。

6.6 本章小结