本文基于Android 11.0源码分析
前言
接上一篇文章 AMS组成 , 介绍了一下AMS的内部数据结构, ProcessRecord容器,还有四大组件记录表 ,。本篇文章继续讲解一下与Activity管理相关的数据结构, 重点关注如下4个类文件:ActivityRecord,TaskRecord,ActivityStack,ActivityStackSupervisor。
基本概念:
-
ActivityRecord:记录着Activity信息;
-
TaskRecord:记录着task信息;
-
ActivityStack:栈信息;
-
ActivityStackSupervisor:栈管理者。
1.ActivityRecord
ActivityRecord,源码中的注释介绍:An entry in the history stack, representing an activity。翻译:历史栈中的一个条目,代表一个activity。
// frameworks/base/services/core/java/com/android/server/wm/ActivityRecord.java
final class ActivityRecord extends WindowToken implements final class ActivityRecord extends ConfigurationContainer {
....
final ActivityTaskManagerService mAtmService; // owner
final IApplicationToken.Stub appToken; // window manager token
final ActivityInfo info; // all about me
// TODO: This is duplicated state already contained in info.applicationInfo - remove
ApplicationInfo appInfo; // information about activity's app
//ActivityRecord所在的TaskRecord
TaskRecord 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)列举出重要的成员变量
![](https://img.haomeiwen.com/i18565088/1d26c8b9ecfed12e.png)
(2)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;
(3)Activity的状态ActivityState
enum ActivityState {
INITIALIZING,
RESUMED, //已恢复
PAUSING,
PAUSED, //已暂停
STOPPING,
STOPPED, //已停止
FINISHING,
DESTROYING,
DESTROYED, //已销毁
RESTARTING_PROCESS
}
(4)时间相关的成员变量
![](https://img.haomeiwen.com/i18565088/1271cfcecf6a3a03.png)
其中AR是指ActivityRecord, AS是指ActivityStack。
2.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来保存所有的ActivityRecord
final ArrayList<ActivityRecord> mActivities;
//TaskRecord所在的ActivityStack
private 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)列出重要的成员变量信息
![](https://img.haomeiwen.com/i18565088/fa6283b5c5cffaf5.png)
3.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来保存TaskRecord
private 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) {
//创建一个task
final 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到mTaskHistory
mTaskHistory.add(position, task);
//为TaskRecord设置ActivityStack
task.setStack(this);
updateTaskMovement(task, toTop);
postAddTask(task, prevStack, schedulePictureInPictureModeChange);
}
....
}
可以看到ActivityStack使用了一个ArrayList来保存TaskRecord。另外,ActivityStack中还持有ActivityStackSupervisor对象,这个是用来管理ActivityStacks的。ActivityStack是由ActivityStackSupervisor来创建的,实际ActivityStackSupervisor就是用来管理ActivityStack的。
(1)列出重要的成员变量信息
![](https://img.haomeiwen.com/i18565088/9cc833f136ce6902.png)
所有前台stack的mResumedActivity的state == RESUMED, 则表示allResumedActivitiesComplete, 此时mLastFocusedStack = mFocusedStack;
4.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;
....
}
5.Activity栈关系
Activity栈结构体的组成关系:
![](https://img.haomeiwen.com/i18565088/629c1ad58ece3378.png)
- 一般地,对于没有分屏功能以及虚拟屏的情况下,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。
网友评论