android里面的Activity体系结构
(1)ActivityDisplay/ActivityStack/TaskRecord/ActivityRecord
1.整体关系图如下
2.类定义相关介绍
整体类图如下:
2.1 ActivityDisplay
ActivityDisplay表示一个屏幕,Android支持三种屏幕:主屏幕,外接屏幕(HDMI等),虚拟屏幕(投屏)。一般情况下,即只有主屏幕时,ActivityStackSupervisor与ActivityDisplay都是系统唯一;
ActivityDisplay是ActivityStackSupervisor的内部类,它相当于一个工具类,封装了移除和添加ActivityStack的方法。
ActivityDisplay 类有如下关键变量
DisplayContent mDisplayContent; // 对应WindowManagerService的显示
/** Actual Display this object tracks. */
int mDisplayId; // id
/**
* All of the stacks on this display. Order matters, topmost stack is in front of all other
* stacks, bottommost behind. Accessed directly by ActivityManager package classes. Any calls
* changing the list should also call {@link #onStackOrderChanged()}.
*/
// 当前显示屏上的所有ActivityStack
private final ArrayList<ActivityStack> mStacks = new ArrayList<>();
2.2 ActivityStack
ActivityStack类有如下关键变量
final int mStackId; // 唯一ID
/** The attached Display's unique identifier, or -1 if detached */
int mDisplayId; // 所处的显示屏id,如果detach则为-1
/**
* The back history of all previous (and possibly still
* running) activities. It contains #TaskRecord objects.
*/
// ActivityStack里面所包含的所有TaskRecord对象
private final ArrayList<TaskRecord> mTaskHistory = new ArrayList<>();
TaskStack mTaskStack; // 对应WindowManagerService里面的
/**
* Current activity that is resumed, or null if there is none.
*/
ActivityRecord mResumedActivity = null; // 当前resume状态的Activity
2.3 TaskRecord
TaskRecord表示任务栈,用于记录activity开启的先后顺序。其所存放的Activity是不支持重新排序的,只能根据压栈和出栈操作更改Activity的顺序。有了TaskRecord,Android系统才能知道当一个Activity退出时,接下来该显示哪一个Activity。
TaskRecord 类有如下关键变量
final int taskId; // Unique identifier for this task.
/** List of all activities in the task arranged in history order */
final ArrayList<ActivityRecord> mActivities; // 当前Task里面所包含的所有Activity对象
/** Current stack. Setter must always be used to update the value. */
private ActivityStack mStack; // 所属的ActivityStack
Task mTask; // 对应WindowManagerService里面的
2.4 ActivityRecord
ActivityRecord是Activity在system_server进程中的镜像,Activity实例与ActivityRecord实例一一对应。ActivityRecord用来存储Activity的信息,如所在的进程名称,应用的包名,所在的任务栈的taskAffinity等。
ActivityRecord 类有如下关键变量
final IApplicationToken.Stub appToken; // window manager token
// TODO: Remove after unification
AppWindowToken mAppWindowToken; // 继承自WindowToken,代表一种window类型,为应用窗口
// activity相关的信息
final ActivityInfo info; // all about me
private TaskRecord task; // the task this is in.
// ActivityRecord在初始化的时候会创建Token对象,作为服务端
static class Token extends IApplicationToken.Stub
(2)ActivityStackSupervisor
ActivityStackSupervisor是ActivityStack的管理者,内部管理了mHomeStack、mFocusedStack和mLastFocusedStack三个ActivityStack。其中,mHomeStack管理的是Launcher相关的Activity栈, stackId为0;mFocusedStack管理的是当前显示在前台Activity的Activity栈;mLastFocusedStack管理的是上一次显示在前台Activity的Activity栈。
public final class ActivityStackSupervisor implements DisplayListener {
/** The stack containing the launcher app. Assumed to always be attached to
* Display.DEFAULT_DISPLAY. */
private ActivityStack mHomeStack;
/** The stack currently receiving input or launching the next activity. */
private ActivityStack mFocusedStack;
/** If this is the same as mFocusedStack then the activity on the top of the focused stack has
* been resumed. If stacks are changing position this will hold the old stack until the new
* stack becomes resumed after which it will be set to mFocusedStack. */
private ActivityStack mLastFocusedStack;
/** Mapping from (ActivityStack/TaskStack).mStackId to their current state */
private SparseArray<ActivityContainer> mActivityContainers = new SparseArray<>();
ActivityStack createStackOnDisplay(int stackId, int displayId) {
……
ActivityContainer activityContainer = new ActivityContainer(stackId);
mActivityContainers.put(stackId, activityContainer);
activityContainer.attachToDisplayLocked(activityDisplay);
return activityContainer.mStack;
}
class ActivityContainer extends android.app.IActivityContainer.Stub {
final ActivityStack mStack;
ActivityDisplay mActivityDisplay;
ActivityContainer(int stackId) {
synchronized (mService) {
mStackId = stackId;
mStack = new ActivityStack(this, mRecentTasks);
}
}
void attachToDisplayLocked(ActivityDisplay activityDisplay) {
……
mActivityDisplay = activityDisplay;
activityDisplay.attachActivities(mStack);
}
protected void detachLocked() {
……
if (mActivityDisplay != null) {
mActivityDisplay.detachActivitiesLocked(mStack);
}
}
}
}
ActivityDisplay的添加和移除ActivityStack的方法又被封装进了ActivityContainer类中,ActivityStackSupervisor调用ActivityContainer的attachToDisplayLocked与detachLocked对ActivityStack列表进行重排序,将任务栈从后台切换至前台。
(3)前台任务栈与后台任务栈
后台任务栈里面的Activity全部处于onStop状态。
(4)成员变量
- ActivityRecord: 记录着Activity信息
- TaskRecord: 记录着task信息
- ActivityStack: 栈信息
4.1 ActivityRecord
Activity的信息记录在ActivityRecord对象, 并通过通过成员变量task指向TaskRecord
- ProcessRecord app //跑在哪个进程
- TaskRecord task //跑在哪个task
- ActivityInfo info // Activity信息
- int mActivityType //Activity类型
- ActivityState state //Activity状态
- ApplicationInfo appInfo //跑在哪个app
- ComponentName realActivity //组件名
- String packageName //包名
- String processName //进程名
- int launchMode //启动模式
- int userId // 该Activity运行在哪个用户id
再来说一说Activity类型和Activity状态的常量:
mActivityType:
- APPLICATION_ACTIVITY_TYPE:普通应用类型
- HOME_ACTIVITY_TYPE:桌面类型
- RECENTS_ACTIVITY_TYPE:最近任务类型
ActivityState:
- INITIALIZING
- RESUMED:已恢复
- PAUSING
- PAUSED:已暂停
- STOPPING
- STOPPED:已停止
- FINISHING
- DESTROYING
- DESTROYED:已销毁
最后,说一说时间相关的成员变量:
时间点 | 赋值时间 | 含义 |
---|---|---|
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。
4.2 TaskRecord
Task的信息记录在TaskRecord对象.
- ActivityStack stack; //当前所属的stack
- ArrayList mActivities; // 当前task的所有Activity列表
- int taskId
- String affinity; 是指root activity的affinity,即该Task中第一个Activity;
- int mCallingUid;
- String mCallingPackage; //调用者的包名
4.3 ActivityStack
- ArrayList mTaskHistory //保存所有的Task列表
- ArrayList mStacks; //所有stack列表
- final int mStackId;
- int mDisplayId;
- ActivityRecord mPausingActivity //正在pause
- ActivityRecord mLastPausedActivity
- ActivityRecord mResumedActivity //已经resumed
- ActivityRecord mLastStartedActivity
所有前台stack的mResumedActivity的state == RESUMED, 则表示allResumedActivitiesComplete, 此时mLastFocusedStack = mFocusedStack;
4.4 ActivityStackSupervisor
- ActivityStack mHomeStack //桌面的stack
- ActivityStack mFocusedStack //当前聚焦stack
- ActivityStack mLastFocusedStack //正在切换
- SparseArray mActivityDisplays //displayId为key
- SparseArray mActivityContainers // mStackId为key
home的栈ID等于0,即HOME_STACK_ID = 0;
(5) Activity栈关系
- 一般地,对于没有分屏功能以及虚拟屏的情况下,ActivityStackSupervisor与ActivityDisplay都是系统唯一;
- ActivityDisplay主要有Home Stack和App Stack这两个栈;
- 每个ActivityStack中可以有若干个TaskRecord对象;
- 每个TaskRecord包含如果若干个ActivityRecord对象;
- 每个ActivityRecord记录一个Activity信息。