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的。
下面是一个简单的关系图
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对象。
近期评论