Android ActivityManagerService总结(三)Activity管理相关数据结构
一. 前言
接上一篇文章 AMS组成 , 介绍了一下AMS的内部数据结构, ProcessRecord容器,还有四大组件记录表 , 本篇文章继续讲解一下与Activity管理相关的数据结构, 重点关注如下4个类文件:ActivityRecord TaskRecord ActivityStack ActivityStackSupervisor
基本概念:
- ActivityRecord: 记录着Activity信息
- TaskRecord: 记录着task信息
- ActivityStack: 栈信息
- ActivityStackSupervisor : 栈管理者
二. ActivityRecord
ActivityRecord,源码中的注释介绍:An entry in the history stack, representing an activity.翻译:历史栈中的一个条目,代表一个activity.
final class ActivityRecord extends ConfigurationContainer {
....final ActivityTaskManagerService mAtmService; // ownerfinal IApplicationToken.Stub appToken; // window manager tokenfinal ActivityInfo info; // all about me// TODO: This is duplicated state already contained in info.applicationInfo - removeApplicationInfo appInfo; // information about activity's app//ActivityRecord所在的TaskRecordTaskRecord task; // the task this is in.//ActivityRecord的构造方法, 需要传递大量的信息ActivityRecord(ActivityTaskManagerService _service, WindowProcessController _caller,int _launchedFromPid, int _launchedFromUid, String _launchedFromPackage, Intent _intent,String _resolvedType, ActivityInfo aInfo, Configuration _configuration,ActivityRecord _resultTo, String _resultWho, int _reqCode, boolean _componentSpecified,boolean _rootVoiceInteraction, ActivityStackSupervisor supervisor,ActivityOptions options, ActivityRecord sourceRecord) {mAtmService = _service;mRootActivityContainer = _service.mRootActivityContainer;appToken = new Token(this, _intent);info = aInfo;launchedFromPid = _launchedFromPid;launchedFromUid = _launchedFromUid;launchedFromPackage = _launchedFromPackage;mUserId = UserHandle.getUserId(aInfo.applicationInfo.uid);intent = _intent;shortComponentName = _intent.getComponent().flattenToShortString();resolvedType = _resolvedType;componentSpecified = _componentSpecified;rootVoiceInteraction = _rootVoiceInteraction;mLastReportedConfiguration = new MergedConfiguration(_configuration);resultTo = _resultTo;resultWho = _resultWho;requestCode = _reqCode;//省略剩下的参数....
}
ActivityRecord中存在着大量的成员变量,包含了一个Activity的所有信息。
ActivityRecord中的成员变量task表示其所在的TaskRecord,由此可以看出:ActivityRecord与TaskRecord建立了联系.
列举出重要的成员变量
序号 | 成员变量 | 描述 |
---|---|---|
1 | ProcessRecord app | 运行在哪个进程 |
2 | TaskRecord task | 运行在哪个task |
3 | ActivityInfo info | Activity的信息 |
4 | int mActivityType | Activity类型 |
5 | ActivityState state | Activity的状态 |
6 | ApplicationInfo appInfo | 运行在哪个app中 |
7 | ComponentName realActivity | 组件名 |
8 | String packageName | 包名 |
9 | String processName | 进程名 |
10 | int launchMode | 启动模式 |
11 | int userId | 该Activity运行在哪个用户id |
Activity类型
/ Activity type is currently not defined. 未定义类型*/public static final int ACTIVITY_TYPE_UNDEFINED = 0;/标准Activity类型 Standard activity type. Nothing special about the activity... */public static final int ACTIVITY_TYPE_STANDARD = 1;/ 桌面类型 Home/Launcher activity type. */public static final int ACTIVITY_TYPE_HOME = 2;/ 最近任务类型 Recents/Overview activity type. There is only one activity with this type in the system. */public static final int ACTIVITY_TYPE_RECENTS = 3;/ 辅助Activity类型Assistant activity type. */public static final int ACTIVITY_TYPE_ASSISTANT = 4;
Activity的状态ActivityState
enum ActivityState {INITIALIZING,RESUMED, //已恢复PAUSING,PAUSED, //已暂停STOPPING, STOPPED, //已停止FINISHING,DESTROYING,DESTROYED, //已销毁RESTARTING_PROCESS}
时间相关的成员变量:
时间点 | 赋值时间 | 含义 |
---|---|---|
createTime | new ActivityRecord | Activity首次创建时间点 |
displayStartTime | AS.setLaunchTime | Activity首次启动时间点 |
fullyDrawnStartTime | AS.setLaunchTime | Activity首次启动时间点 |
startTime | Activity上次启动的时间点 | |
lastVisibleTime | AR.windowsVisibleLocked | Activity上次成为可见的时间点 |
cpuTimeAtResume | AS.completeResumeLocked | 从Rsume以来的cpu使用时长 |
pauseTime | AS.startPausingLocked | Activity上次暂停的时间点 |
launchTickTime | AR.startLaunchTickingLocked | Eng版本才赋值 |
lastLaunchTime | ASS.realStartActivityLocked | 上一次启动时间 |
其中AR是指ActivityRecord, AS是指ActivityStack。
三. TaskRecord
Task的信息记录在TaskRecord对象.
TaskRecord,内部维护一个 ArrayList<ActivityRecord> 用来保存ActivityRecord。
frameworks/base/services/core/java/com/android/server/am/TaskRecord.java
final int taskId; // Unique identifier for this task. 任务ID/ List of all activities in the task arranged in history order *///使用一个ArrayList来保存所有的ActivityRecordfinal ArrayList<ActivityRecord> mActivities;//TaskRecord所在的ActivityStackprivate ActivityStack mStack; //构造方法
TaskRecord(ActivityTaskManagerService service, int _taskId, ActivityInfo info, Intent _intent,IVoiceInteractionSession _voiceSession, IVoiceInteractor _voiceInteractor) {mService = service;userId = UserHandle.getUserId(info.applicationInfo.uid);taskId = _taskId;lastActiveTime = SystemClock.elapsedRealtime();mAffiliatedTaskId = _taskId;voiceSession = _voiceSession;voiceInteractor = _voiceInteractor;isAvailable = true;mActivities = new ArrayList<>();mCallingUid = info.applicationInfo.uid;mCallingPackage = info.packageName;setIntent(_intent, info);setMinDimensions(info);touchActiveTime();mService.getTaskChangeNotificationController().notifyTaskCreated(_taskId, realActivity);}
列出重要的成员变量信息
序号 | 成员变量 | 描述 |
---|---|---|
1 | ActivityStack stack | 当前所属的stack |
2 | ArrayList mActivities | 当前task的所有Activity列表 |
3 | int taskId | taskID |
4 | String affinity | 是指root activity的affinity,即该Task中第一个Activity; |
5 | int mCallingUid | 调用者的UID |
6 | String mCallingPackage | 调用者的包名 |
四. ActivityStack
ActivityStack,内部维护了一个 ArrayList<TaskRecord> ,用来管理TaskRecord
class ActivityStack extends ConfigurationContainer {
...../* The back history of all previous (and possibly still* running) activities. It contains #TaskRecord objects.*/// 使用一个ArrayList来保存TaskRecordprivate final ArrayList<TaskRecord> mTaskHistory = new ArrayList<>();//持有一个 ActivityStackSupervisor,所有的运行中的ActivityStacks都通过它来进行管protected final ActivityStackSupervisor mStackSupervisor;//构造方法TaskRecord createTaskRecord(int taskId, ActivityInfo info, Intent intent,IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,boolean toTop, ActivityRecord activity, ActivityRecord source,ActivityOptions options) {//创建一个taskfinal TaskRecord task = TaskRecord.create(mService, taskId, info, intent, voiceSession, voiceInteractor);// add the task to stack first, mTaskPositioner might need the stack association//将task添加到ActivityStack中去addTask(task, toTop, "createTaskRecord");final int displayId = mDisplayId != INVALID_DISPLAY ? mDisplayId : DEFAULT_DISPLAY;final boolean isLockscreenShown = mService.mStackSupervisor.getKeyguardController().isKeyguardOrAodShowing(displayId);if (!mStackSupervisor.getLaunchParamsController().layoutTask(task, info.windowLayout, activity, source, options)&& !matchParentBounds() && task.isResizeable() && !isLockscreenShown) {task.updateOverrideConfiguration(getRequestedOverrideBounds());}task.createTask(toTop, (info.flags & FLAG_SHOW_FOR_ALL_USERS) != 0);return task;}//添加Task到指定位置void addTask(final TaskRecord task, int position, boolean schedulePictureInPictureModeChange,String reason) {// TODO: Is this remove really needed? Need to look into the call path for the other addTask//若存在,先移除mTaskHistory.remove(task);if (isSingleTaskInstance() && !mTaskHistory.isEmpty()) {throw new IllegalStateException("Can only have one child on stack=" + this);}position = getAdjustedPositionForTask(task, position, null /* starting */);final boolean toTop = position >= mTaskHistory.size();final ActivityStack prevStack = preAddTask(task, reason, toTop);//添加task到mTaskHistorymTaskHistory.add(position, task);//为TaskRecord设置ActivityStacktask.setStack(this);updateTaskMovement(task, toTop);postAddTask(task, prevStack, schedulePictureInPictureModeChange);}
....
}
可以看到ActivityStack使用了一个ArrayList来保存TaskRecord。
另外,ActivityStack中还持有ActivityStackSupervisor对象,这个是用来管理ActivityStacks的。
ActivityStack是由ActivityStackSupervisor来创建的,实际ActivityStackSupervisor就是用来管理
ActivityStack的.
列出重要的成员变量信息
序号 | 成员变量 | 描述 |
---|---|---|
1 | ArrayList mTaskHistory | 保存所有的Task列表 |
2 | ArrayList mStacks | 所有stack列表 |
3 | int mStackId | 栈ID |
4 | int mDisplayId | affinity附加的显示器的唯一标识符,如果已分离,则为-1 |
5 | ActivityRecord mPausingActivity | 正在pause状态的ActivityRecord |
6 | ActivityRecord mLastPausedActivity | 最后pause状态ActivityRecord |
7 | ActivityRecord mResumedActivity | 已经resumed Activity的ActivityRecord对象 |
所有前台stack的mResumedActivity的state == RESUMED, 则表示allResumedActivitiesComplete, 此时mLastFocusedStack = mFocusedStack;
五. ActivityStackSupervisor
ActivityStackSupervisor,顾名思义,就是用来管理ActivityStack的
frameworks/base/services/core/java/com/android/server/wm/ActivityDisplay.java
class ActivityDisplay extends ConfigurationContainer<ActivityStack>implements WindowContainerListener {
....//管理的是Launcher相关的任务private ActivityStack mHomeStack = null; //管理的是Recent相关的任务栈private ActivityStack mRecentsStack = null;//画中画的任务栈private ActivityStack mPinnedStack = null;//分屏模式下的主屏幕栈private ActivityStack mSplitScreenPrimaryStack = null;
....
}
六. Activity栈关系
Activity栈结构体的组成关系: 点击查看大图
- 一般地,对于没有分屏功能以及虚拟屏的情况下,ActivityStackSupervisor与ActivityDisplay都是系统唯一;
- ActivityDisplay主要有Home Stack和App Stack这两个栈;
- 每个ActivityStack中可以有若干个TaskRecord对象;
- 每个TaskRecord包含如果个ActivityRecord对象;
- 每个ActivityRecord记录一个Activity信息。
(1)正向关系链表:
-
ActivityStackSupervisor.mActivityDisplays
-
-> ActivityDisplay.mStacks
-
-> ActivityStack.mTaskHistory
-
-> TaskRecord.mActivities
-
-> ActivityRecord
(2)反向关系链表:
-
ActivityRecord.task
-
-> TaskRecord.stack
-
-> ActivityStack.mStackSupervisor
-
-> ActivityStackSupervisor
注:ActivityStack.mDisplayId可找到所对应的ActivityDisplay;
七. 参考文章
四大组件之ActivityRecord
AMS:ActivityRecord 理解