• ActivityStackSupervisor、ActivityStack、ActivityDisplay、TaskRecord、ActivityRecord


    从ActivityStackSupervisor -> ActivityRecord

    ActivityStackSupervisor

    	1、ActivityStackSupervisor 是在ActivityManagerService 的构造函数里面创建的,而ActivityManagerService是整个系统唯一的,所以ActivityStackSupervisor 也是唯一的。
    
    • 1
    public ActivityManagerService(Context systemContext) {
    省略不必要代码
    ........
    mStackSupervisor = createStackSupervisor();
    .........
    }
    
    创建ActivityStackSupervisor
    protected ActivityStackSupervisor createStackSupervisor() {
            final ActivityStackSupervisor supervisor = new ActivityStackSupervisor(this, mHandler.getLooper());
            supervisor.initialize();
            return supervisor;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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);
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    3、ActivityDisplay 所持属性
    一个屏幕只有一个ActivityDisplay,这个里面记录当前屏幕启动的所有activity

    mHomeStack:ActivityStacklauncher 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

    他们的关系图如下
    在这里插入图片描述

  • 相关阅读:
    Python 利用pandas和matplotlib绘制饼图
    PDF文件压缩软件 PDF Squeezer mac中文版​软件特点
    赛码网输入输出(js v8)问题并配置赛码网vscode本地环境
    Oracle两个日期都存在返回最小/最大的,如果只存在一个就返回存在的日期
    NEUQ2022第一次双周赛题解
    Mac SpringBoot项目 Gradle 7.3 转 Maven 手把手教学,包学会~
    七夕 跟mysql 数据库一起度过
    [附源码]JAVA毕业设计简易在线教学系统(系统+LW)
    JSP合同信息管理系统
    SpringCloudAlibaba Gateway(二)详解-内置Predicate、Filter及自定义Predicate、Filter
  • 原文地址:https://blog.csdn.net/lisiwei1994/article/details/127694203