android的ActivityDisplay/ActivityStack/TaskRecord/ActivityRecord体系结构(1)

本文主要从3个方面来介绍这ActivityDisplay/ActivityStack/TaskRecord/ActivityRecord的关系几个类之间的关系,先从整体关系图,对4个类的关系有个大概的了解,然后通过dumpsys命令,来验证这种关系;然后从类定义的角度来看,4个类是如何互相包含的;最后从Activity启动的流程过程来看4个类是如何关联上来的。

通过阅读本文,能对ActivityDisplay/ActivityStack/TaskRecord/ActivityRecord的关系有个整体的认识和理解

1.整体关系图如下

image.png

通过adb shell dumpsys activity activities 命令可以看到如下打印:

说明:
1.在#0的ActivityDisplay上,总共有2个Stack,代表2个应用
2.在Stack #4里面,有一个TaskRecord,Task id #87
3.在TaskRecord里面,Activities列表里面只有一个ActivityRecord

ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
Display #0 (activities from top to bottom):

  Stack #4: type=standard mode=fullscreen
  isSleeping=false
  mBounds=Rect(0, 0 - 0, 0)
    Task id #87
    * TaskRecord{3a93f6f #87 A=com.android.deskclock U=0 StackId=4 sz=1}
      userId=0 effectiveUid=u0a93 mCallingUid=u0a81 mUserSetupComplete=true mCallingPackage=com.android.launcher3
      intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.android.deskclock/.DeskClock}
      Activities=[ActivityRecord{ed5f802 u0 com.android.deskclock/.DeskClock t87}]
      mRootProcess=ProcessRecord{64a3d2f 4887:com.android.deskclock/u0a93}
      stackId=4
      hasBeenVisible=true mResizeMode=RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION mSupportsPictureInPicture=false isResizeable=true lastActiveTime=223590378 (inactive for 50s)
      * Hist #0: ActivityRecord{ed5f802 u0 com.android.deskclock/.DeskClock t87}
          app=ProcessRecord{64a3d2f 4887:com.android.deskclock/u0a93}
          Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.android.deskclock/.DeskClock bnds=[35,503][237,780] }    
          state=RESUMED stopped=false delayedResume=false finishing=false
    Running activities (most recent first):
      TaskRecord{3a93f6f #87 A=com.android.deskclock U=0 StackId=4 sz=1}
        Run #0: ActivityRecord{ed5f802 u0 com.android.deskclock/.DeskClock t87}
    mResumedActivity: ActivityRecord{ed5f802 u0 com.android.deskclock/.DeskClock t87}
    mLastPausedActivity: ActivityRecord{ed5f802 u0 com.android.deskclock/.DeskClock t87}

  Stack #0: type=home mode=fullscreen
  isSleeping=false
  mBounds=Rect(0, 0 - 0, 0)
    Task id #83
    mBounds=Rect(0, 0 - 0, 0)
    mMinWidth=-1
    mMinHeight=-1
    mLastNonFullscreenBounds=null
    * TaskRecord{6dee666 #83 ?? U=0 StackId=0 sz=1}
      userId=0 effectiveUid=u0a81 mCallingUid=u0a81 mUserSetupComplete=true mCallingPackage=com.android.launcher3
      intent={act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.android.launcher3/.Launcher}
      Activities=[ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83}]
      mRootProcess=ProcessRecord{d9a8f3c 2055:com.android.launcher3/u0a81}
      stackId=0
      hasBeenVisible=true mResizeMode=RESIZE_MODE_RESIZEABLE mSupportsPictureInPicture=false isResizeable=true lastActiveTime=223589976 (inactive for 50s)
      * Hist #0: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83}        
          app=ProcessRecord{d9a8f3c 2055:com.android.launcher3/u0a81}
          Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.android.launcher3/.Launcher }
          state=STOPPED stopped=true delayedResume=false finishing=false
    Running activities (most recent first):
      TaskRecord{6dee666 #83 ?? U=0 StackId=0 sz=1}
        Run #0: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83}
    mLastPausedActivity: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83}
 ResumedActivity:ActivityRecord{ed5f802 u0 com.android.deskclock/.DeskClock t87}
  ResumedActivity: ActivityRecord{ed5f802 u0 com.android.deskclock/.DeskClock t87}

2.类定义相关介绍

整体类图如下:


image.png

2.1 ActivityDisplay

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 类有如下关键变量

    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 类有如下关键变量

   
    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

3.ActivityDisplay/ActivityStack/TaskRecord/ActivityRecord如何关联

详细流程可以阅读Activity 启动流程log分析

3.1 ActivityRecord创建

在startActivity的过程中,会先new ActivityRecord

08-23 17:30:21.261  1314  4528 V ActivityTaskManager: java.lang.Throwable
08-23 17:30:21.261  1314  4528 V ActivityTaskManager:   at com.android.server.wm.ActivityRecord.setState(ActivityRecord.java:1857)
08-23 17:30:21.261  1314  4528 V ActivityTaskManager:   at com.android.server.wm.ActivityRecord.<init>(ActivityRecord.java:964)
08-23 17:30:21.261  1314  4528 V ActivityTaskManager:   at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:902)

3.2 ActivityStack创建以及和ActivityDisplay的关联

ActivityStack也在是startActivity的过程中创建的

08-23 17:30:21.285  1314  4528 D ActivityTaskManager:   at com.android.server.wm.ActivityStack.<init>(ActivityStack.java:511)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager:   at com.android.server.wm.ActivityDisplay.createStackUnchecked(ActivityDisplay.java:465)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager:   at com.android.server.wm.ActivityDisplay.createStack(ActivityDisplay.java:455)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager:   at com.android.server.wm.ActivityDisplay.getOrCreateStack(ActivityDisplay.java:383)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager:   at com.android.server.wm.ActivityDisplay.getOrCreateStack(ActivityDisplay.java:401)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager:   at com.android.server.wm.RootActivityContainer.getLaunchStack(RootActivityContainer.java:1737)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager:   at com.android.server.wm.ActivityStarter.getLaunchStack(ActivityStarter.java:2704)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager:   at com.android.server.wm.ActivityStarter.computeStackFocus(ActivityStarter.java:2612)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager:   at com.android.server.wm.ActivityStarter.setTaskFromReuseOrCreateNewTask(ActivityStarter.java:2323)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager:   at com.android.server.wm.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1688)
08-23 17:30:21.285  1314  4528 D ActivityTaskManager:   at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:1404)

在ActivityStack的构造方法中,会调用ActivityDisplay的addChild方法,

display.addChild(this, onTop ? POSITION_TOP : POSITION_BOTTOM);

将自己加入到ActivityDisplay的mStack里面,mStack定义如下

ArrayList<ActivityStack> mStacks

此时,ActivityDisplay和ActivityStack关联起来

3.3 TaskRecord创建以及和ActivityStack的关联

TaskRecord也在是startActivity的过程中创建的

08-23 17:30:21.292  1314  4528 D ActivityTaskManager:   at com.android.server.wm.TaskRecord.create(TaskRecord.java:2704)
08-23 17:30:21.292  1314  4528 D ActivityTaskManager:   at com.android.server.wm.ActivityStack.createTaskRecord(ActivityStack.java:5515)
08-23 17:30:21.292  1314  4528 D ActivityTaskManager:   at com.android.server.wm.ActivityStarter.setTaskFromReuseOrCreateNewTask(ActivityStarter.java:2330)
08-23 17:30:21.292  1314  4528 D ActivityTaskManager:   at com.android.server.wm.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1688)

在ActivityStack.createTaskRecord方法里面,调用addTask将TaskRecord和ActivityStack关联起来

addTask(task, toTop, "createTaskRecord");

将task加入 mTaskHistory,其定义如下

private final ArrayList<TaskRecord> mTaskHistory = new ArrayList<>();

3.4 TaskRecord和ActivityRecord的关联
在3.1 和3.3节分别创建了ActivityRecord和TaskRecord对象,

08-23 17:30:21.296  1314  4528 D ActivityTaskManager:   at com.android.server.wm.ActivityStarter.addOrReparentStartingActivity(ActivityStarter.java:2574)
08-23 17:30:21.296  1314  4528 D ActivityTaskManager:   at com.android.server.wm.ActivityStarter.setTaskFromReuseOrCreateNewTask(ActivityStarter.java:2335)
08-23 17:30:21.296  1314  4528 D ActivityTaskManager:   at com.android.server.wm.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1688)
08-23 17:30:21.296  1314  4528 D ActivityTaskManager:   at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:1404)

在setTaskFromReuseOrCreateNewTask方法里面,先调用createTaskRecord来创建TaskRecord,然后调用addOrReparentStartingActivity来设置Activity与TaskRecord的关系

setTaskFromReuseOrCreateNewTask () {
     .....
     final TaskRecord task = mTargetStack.createTaskRecord(
                    mSupervisor.getNextTaskIdForUserLocked(mStartActivity.mUserId),
                    mNewTaskInfo != null ? mNewTaskInfo : mStartActivity.info,
                    mNewTaskIntent != null ? mNewTaskIntent : mIntent, mVoiceSession,
                    mVoiceInteractor, toTop, mStartActivity, mSourceRecord, mOptions);
     addOrReparentStartingActivity(task, "setTaskFromReuseOrCreateNewTask - mReuseTask");
     .....
}

private void addOrReparentStartingActivity(TaskRecord parent, String reason) {
        Slog.d(TAG,"addOrReparentStartingActivity",new Throwable());
        // 如果当前ActivityRecord没有设置TaskRecord或者已经设置过就是给定的parent,则添加到mActivities列表里面
        if (mStartActivity.getTaskRecord() == null || mStartActivity.getTaskRecord() == parent) {
            parent.addActivityToTop(mStartActivity); // 会调用r.setTask(this)设置关联关系
        } else {
            // 将当前要启动的Activity重新关联到给定的parent 上
            mStartActivity.reparent(parent, parent.mActivities.size() /* top */, reason);
        }
 }

————————————————
版权声明:本文为CSDN博主「chadm」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42695485/article/details/108680240

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容