ActivityStackSupervisor、ActivityStack、ActivityDisplay、TaskRecord、ActivityRecord

Activity的持有关系

  • 从ActivityStackSupervisor -> ActivityRecord
    • ActivityStackSupervisor

从ActivityStackSupervisor -> ActivityRecord

ActivityStackSupervisor

	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

他们的关系图如下
ActivityStackSupervisor、ActivityStack、ActivityDisplay、TaskRecord、ActivityRecord_第1张图片

你可能感兴趣的:(activity,android,Activity)