本文主要從3個方面來介紹這ActivityDisplay/ActivityStack/TaskRecord/ActivityRecord的關(guān)系幾個類之間的關(guān)系,先從整體關(guān)系圖,對4個類的關(guān)系有個大概的了解,然后通過dumpsys命令,來驗(yàn)證這種關(guān)系;然后從類定義的角度來看,4個類是如何互相包含的;最后從Activity啟動的流程過程來看4個類是如何關(guān)聯(lián)上來的。
通過閱讀本文,能對ActivityDisplay/ActivityStack/TaskRecord/ActivityRecord的關(guān)系有個整體的認(rèn)識和理解
1.整體關(guān)系圖如下
通過adb shell dumpsys activity activities 命令可以看到如下打印:
說明:
1.在#0的ActivityDisplay上,總共有2個Stack,代表2個應(yīng)用
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.類定義相關(guān)介紹
整體類圖如下:
2.1 ActivityDisplay
ActivityDisplay 類有如下關(guān)鍵變量
DisplayContent mDisplayContent; // 對應(yīng)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()}.
*/
// 當(dāng)前顯示屏上的所有ActivityStack
private final ArrayList<ActivityStack> mStacks = new ArrayList<>();
2.2 ActivityStack
ActivityStack類有如下關(guān)鍵變量
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; // 對應(yīng)WindowManagerService里面的
/**
* Current activity that is resumed, or null if there is none.
*/
ActivityRecord mResumedActivity = null; // 當(dāng)前resume狀態(tài)的Activity
2.3 TaskRecord
TaskRecord 類有如下關(guān)鍵變量
final int taskId; // Unique identifier for this task.
/** List of all activities in the task arranged in history order */
final ArrayList<ActivityRecord> mActivities; // 當(dāng)前Task里面所包含的所有Activity對象
/** Current stack. Setter must always be used to update the value. */
private ActivityStack mStack; // 所屬的ActivityStack
Task mTask; // 對應(yīng)WindowManagerService里面的
2.4 ActivityRecord
ActivityRecord 類有如下關(guān)鍵變量
final IApplicationToken.Stub appToken; // window manager token
// TODO: Remove after unification
AppWindowToken mAppWindowToken; // 繼承自WindowToken,代表一種window類型,為應(yīng)用窗口
// activity相關(guān)的信息
final ActivityInfo info; // all about me
private TaskRecord task; // the task this is in.
// ActivityRecord在初始化的時候會創(chuàng)建Token對象,作為服務(wù)端
static class Token extends IApplicationToken.Stub
3.ActivityDisplay/ActivityStack/TaskRecord/ActivityRecord如何關(guān)聯(lián)
詳細(xì)流程可以閱讀Activity 啟動流程log分析
3.1 ActivityRecord創(chuàng)建
在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創(chuàng)建以及和ActivityDisplay的關(guān)聯(lián)
ActivityStack也在是startActivity的過程中創(chuàng)建的
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的構(gòu)造方法中,會調(diào)用ActivityDisplay的addChild方法,
display.addChild(this, onTop ? POSITION_TOP : POSITION_BOTTOM);
將自己加入到ActivityDisplay的mStack里面,mStack定義如下
ArrayList<ActivityStack> mStacks
此時,ActivityDisplay和ActivityStack關(guān)聯(lián)起來
3.3 TaskRecord創(chuàng)建以及和ActivityStack的關(guān)聯(lián)
TaskRecord也在是startActivity的過程中創(chuàng)建的
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方法里面,調(diào)用addTask將TaskRecord和ActivityStack關(guān)聯(lián)起來
addTask(task, toTop, "createTaskRecord");
將task加入 mTaskHistory,其定義如下
private final ArrayList<TaskRecord> mTaskHistory = new ArrayList<>();
3.4 TaskRecord和ActivityRecord的關(guān)聯(lián)
在3.1 和3.3節(jié)分別創(chuàng)建了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方法里面,先調(diào)用createTaskRecord來創(chuàng)建TaskRecord,然后調(diào)用addOrReparentStartingActivity來設(shè)置Activity與TaskRecord的關(guān)系
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());
// 如果當(dāng)前ActivityRecord沒有設(shè)置TaskRecord或者已經(jīng)設(shè)置過就是給定的parent,則添加到mActivities列表里面
if (mStartActivity.getTaskRecord() == null || mStartActivity.getTaskRecord() == parent) {
parent.addActivityToTop(mStartActivity); // 會調(diào)用r.setTask(this)設(shè)置關(guān)聯(lián)關(guān)系
} else {
// 將當(dāng)前要啟動的Activity重新關(guān)聯(lián)到給定的parent 上
mStartActivity.reparent(parent, parent.mActivities.size() /* top */, reason);
}
}
————————————————
版權(quán)聲明:本文為CSDN博主「chadm」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_42695485/article/details/108680240