AMS-ActivityRecord、TaskRecord、ActivityStack的关系

0

1ActivityRecord

frameworks/base/services/core/java/com/android/server/wm/ActivityRecord.java
final class ActivityRecord {
  // AMS的引用
  final ActivityManagerService service; // owner
  // token用来和WMS交互
  final IApplicationToken.Stub appToken; // window manager token
  final ActivityInfo info; // all about me
  final ApplicationInfo appInfo; // information about activity's app
  final ComponentName realActivity; // the intent component, or target of an alias.
  ...
  //Activity资源信息
  CharSequence nonLocalizedLabel; // the label information from the package mgr.
  int labelRes; // the label information from the package mgr.
  int icon; // resource identifier of activity's icon.
  int logo; // resource identifier of activity's logo.
  int theme; // resource identifier of activity's theme.
  int realTheme; // actual theme resource we will use, never 0.
  int windowFlags; // custom window flags for preview window.
  // ActivityRecord所在的TaskRecord
  TaskRecord task; // the task this is in.
  ...
  // ActivityRecord所在进程
  ProcessRecord app; // if non-null, hosting application
  ActivityState state; // current state we are in
  ...
}

ActivityRecord就是Activity在AMS中的代表,ActivityRecord和应用中的Activity一一对应,并
且包含了Activity的所有信息。(就好比Activity在ActivityThread中对应ActivityClientRecord一
样)
每一个ActivityRecord都会有一个Activity与之对应,一个Activity可能会有多个
ActivityRecord,因为Activity可以被多次实例化,取决于其Launchmode。
其中task对象标识了其所归属的TaskRecord,这样ActivityRecord和TaskRecord就联系起来了。

2 TaskRecord

final class TaskRecord {
  // TaskRecord的唯一标识
  final int taskId; // Unique identifier for this task.
  .....
  // This represents the last resolved activity values for thistask
  // NOTE: This value needs to be persisted with each task
  TaskDescription lastTaskDescription = new TaskDescription();
  // TaskRecord里所有的ActivityRecord信息
  /** List of all activities in the task arranged in history order */
  final ArrayList<ActivityRecord> mActivities;
  // TaskRecord所在的stack
  ActivityStack stack;
  ......
}

TaskRecord中我列出来三个成员变量:
taskId:唯一标示的id号
mActivities:当前栈中所有的ActivityRecord
stack:ActivityStack的引用,为了回调ActivityStack的方法
从TaskRecord 的数据结构我们可以看到,mActivities保存了一组ActivityRecord信息,同时每
一个ActivityRecord都有其所在TaskRecord的引用。TaskRecord都有一个唯一标示taskId,
还包含了ActivityStack的引用对象。
因此,TaskRecord可以理解为一个mActivities组成的栈,也可以理解为一个由一系列Activity
组成的活动。

3 ActivityStack

final class ActivityStack {
  /**
  * The back history of all previous (and possibly still
  * running) activities. It contains #TaskRecord objects.
  */
  private final ArrayList<TaskRecord> mTaskHistory = new ArrayList<>();
  ...
  final int mStackId;
  ...
  /** Run all ActivityStacks through this */
  final ActivityStackSupervisor mStackSupervisor;
}

4关系图

每一个ActivityRecord都会有一个Activity与之对应。一系列相关的ActivityRecord组成了一个
TaskRecord,TaskRecord是存在于ActivityStack中,ActivityStackSupervisor是用来管理这
些ActivityStack的。
下面是一个简单的关系图

file

Task 是Activity的集合。Android把用户一次相关操作用使用的Activity按照先后顺序保存在
Task中,这样当用户按back键的时候就能按照相反的顺序依次返回退出。Task像一个栈,以
先进后出的方式管理着Activity。系统运行时内存中会存在多个Task,当我们查看最近任务栏
时,会弹出一个列表让你选择,这个列表就是系统中存在的Task集合,选择一个Task会将它
所包含的Activity作为一个整体带到前台。Task中的Activity的顺序通常是不能改变的,只能压
栈和出栈。
AMS中使用ActivityStack 类来管理Task,它管理的Task都存放在成员变量mTaskHistory
中。mTaskHistory也是一个列表,存储的是TaskRecord对象。TaskRecord对象代表一个
Task,他的成员变量mActivities也是一个列表,存储了属于该Task中的所有ActivityRecord对象。