一. 前言
接上一篇文章 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; // 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 | 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来保存所有的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 | 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来保存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 | 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;