AMS -- ActivityRecord、TaskRecord、ActivityStack、ActivityDisplay、ActivityStackSupervisor

ActivityRecord、TaskRecord、ActivityStack、ActivityDisplay、ActivityStackSupervisor 的关系

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
ArrayListmActivities当前task的所有Activity列表
inttaskIdTaskRecord的Id
Stringaffinityroot activity的affinity,即该Task中第一个Activity
intmCallingUid调用者的UserId
StringmCallingPackage调用者的包名

ActivityStack

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

类型名称说明
ArrayListmTaskHistory保存所有的Task列表
ArrayListmStacks所有的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
SparseArraymActivityDisplaysdisplayId为key
SparseArraymActivityContainersmStackId为key

ActivityDisplay

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

记忆关系链

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

1
2
3
4
5
6
7
8
java

 代码解读
复制代码ActivityStackSupervisor.mActivityDisplays
-> ActivityDisplay.mStack
-> ActivityStack.mTaskHistory
-> TaskRecord.mActivities
-> ActivityRecord

反向关系链

1
2
3
4
5
6
7
java

 代码解读
复制代码ActivityRecord.task
-> TaskRecord.mStack
-> ActivityStack.mStackSupervisor
-> ActivityStackSupervisor

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

image.png

TaskRecord.webp

引用:

作者:彭小铭
链接:https://juejin.cn/post/7267554771540049957
来源:稀土掘金

0%