每日一问 | ActivityManagerService Activity栈管理

291 阅读2分钟

截屏2023-08-16 14.48.18.png

原问题出处:每日一问 | ActivityRecord、TaskRecord、ActivityStack、ActivityDisplay、ActivityStackSupervisor 分别是干什么的? https://wanandroid.com/wenda/show/21681

ActivityManagerService Activity栈管理

ActivityRecord

记录Activity的信息,并通过成员变量task指向TaskRecord。

类型名称说明
ProcessRecordapp跑在哪个进程
TaskRecordtask跑在哪个task
ActivityInfoinfoActivity信息
intmActivityTypeActivity类型
ActivityStatestateActivity状态
ApplicationInfoappInfo跑在哪个app
ComponentNamerealActivity组件名
StringpackageName包名
StringprocessName进程名
intlaunchMode启动模式
intuserId该Activity运行在哪个用户Id

TaskRecord

描述Activity的Affinity所属的栈。

类型名称说明
ActivityStackstack当前所属的stack
ArrayList<ActivityRecord>mActivities当前task的所有Activity列表
inttaskIdTaskRecord的Id
Stringaffinityroot activity的affinity,即该Task中第一个Activity
intmCallingUid调用者的UserId
StringmCallingPackage调用者的包名

ActivityStack

管理着TaskRecord,内部维护Activity所有状态、特殊状态的Activity和Activity相关的列表数据。

类型名称说明
ArrayList<TaskRecord>mTaskHistory保存所有的Task列表
ArrayList<ActivityStack>mStacks所有的stack列表
intmStackIdActivityStackvisor的mActivityContainers的key值Id
intmDisplayIdActivityStackSupervisor的mActivityDisplays的key值Id
ActivityRecordmPauseingActivity正在暂停的Activity
ActivityRecordmLastPausedActivity上一个已暂停的Activity
ActivityRecordmResumedActivity已经Resumed的Activity
ActivityRecordmLastStartedActivity最近一次启动的Activity

ActivityStackSupervisor

管理所有的ActivityStack。

类型名称说明
ActivityStackmHomeStack桌面的stack
ActivityStackmFocusedStack当前聚焦的stack
ActivityStackmLastFocusedStack正在切换到聚焦的stack
SparseArray<ActivityDisplay>mActivityDisplaysdisplayId为key
SparseArray<ActivityContainer>mActivityContainersmStackId为key

ActivityDisplay

表示一个屏幕,Android支持三种屏幕:主屏幕,外接屏幕(HDMI等),虚拟屏幕(投屏)一般地,对于没有分屏功能以及虚拟屏的情况下,ActivityStackSupervisor与ActivityDisplay都是系统唯一;ActivityDisplay主要有Home Stack和App Stack这两个栈。

记忆关系链

每个ActivityStack中可以有若干个TaskRecord对象;每个TaskRecord中可以有若干个ActivityRecord对象;每个ActivityRecord记录一个Activity信息。 正向关系链表:

ActivityStackSupervisor.mActivityDisplays
-> ActivityDisplay.mStack
-> ActivityStack.mTaskHistory
-> TaskRecord.mActivities
-> ActivityRecord

反向关系链

ActivityRecord.task
-> TaskRecord.mStack
-> ActivityStack.mStackSupervisor
-> ActivityStackSupervisor

ActivityStack.mDisplayId可以找到对应的ActivityDisplay,HOME_STACK_ID=0可以在ActivityStackSupervisor.mActivityDisplays找到桌面的ActivityStack。

AMS关系链表 Activity栈模型