1、ActivityStackSupervisor 是在ActivityManagerService 的构造函数里面创建的,而ActivityManagerService是整个系统唯一的,所以ActivityStackSupervisor 也是唯一的。
public ActivityManagerService(Context systemContext) {
省略不必要代码
........
mStackSupervisor = createStackSupervisor();
.........
}
创建ActivityStackSupervisor
protected ActivityStackSupervisor createStackSupervisor() {
final ActivityStackSupervisor supervisor = new ActivityStackSupervisor(this, mHandler.getLooper());
supervisor.initialize();
return supervisor;
}
2、ActivityStackSupervisor 所持属性
| 类型 | 名称 |
|---|---|
| mHomeStack : ActivityStack | 默认屏幕上的launcher app 里面所启动的activity(仅launcher 不包括其他app 的)都在这个stack里面 |
| mFocusedStack: ActivityStack | 当前正在启动的或者已经启动的activity保存在这个stack里面 |
| mLastFocusedStack:ActivityStack | 和mFocusedStack的差别就是mLastFocusedStack保存了上一个mFocusedStack |
| mActivityDisplays:SparseArray | 一个屏幕对应一个ActivityDisplay,这个里面记录了每一个屏幕里的activity |
| mStackId:int | 当前屏幕上的唯一标识符 |
在ActivityStackSupervisor里面有一个重要的方法,这个在SystemServer New ActivityManagerService之后,调用了ActivityManagerService的setWindowManager -> ActivityStackSupervisor的setWindowManager
void setWindowManager(WindowManagerService wm) {
synchronized (mService) {
mWindowManager = wm;
getKeyguardController().setWindowManager(wm);
mDisplayManager =
(DisplayManager)mService.mContext.getSystemService(Context.DISPLAY_SERVICE);
mDisplayManager.registerDisplayListener(this, null);
mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
Display[] displays = mDisplayManager.getDisplays();
for (int displayNdx = displays.length - 1; displayNdx >= 0; --displayNdx) {
final Display display = displays[displayNdx];
// 有几个屏幕就new 几个 ActivityDisplay
ActivityDisplay activityDisplay = new ActivityDisplay(this, display);
//每一个屏幕对应一个ActivityDisplay
mActivityDisplays.put(display.getDisplayId(), activityDisplay);
calculateDefaultMinimalSizeOfResizeableTasks(activityDisplay);
}
// 第一次调用这个方法那就是创造一个默认屏幕的stack,然乎home 、focused、lastfocused 三个相等
mHomeStack = mFocusedStack = mLastFocusedStack = getDefaultDisplay().getOrCreateStack(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP);
}
}
3、ActivityDisplay 所持属性
一个屏幕只有一个ActivityDisplay,这个里面记录当前屏幕启动的所有activity
| mHomeStack:ActivityStack | launcher app 里面所启动的activity(仅launcher 不包括其他app 的)都在这个stack里面 |
|---|---|
| mRecentsStack:ActivityStack | 最近的所有activity都在这个stack里面 |
| mPinnedStack:ActivityStack | 画中画模式的activity都在这个stack里面 |
| mSplitScreenPrimaryStack:ActivityStack | 分屏模式的activity都在这个stack里面 |
4、TaskRecord 所持属性
TaskRecord 是记录一个或者多个activity,一个任务可能由一个activity完成也可能有多个activity
| taskId:int | 该任务的唯一标识符 |
|---|---|
| mActivitiesArrayList | 用来记录该task里的activity |
他们的关系图如下
