AMS重要的数据结构解析(三)

  • Post author:
  • Post category:其他


final String shortComponentName; // the short component name of the intent

final String packageName; // the package implementing intent’s component

final String processName; // process where this component wants to run

final String taskAffinity; // as per ActivityInfo.taskAffinity

boolean fullscreen; // covers the full screen?

}



[](()2.2、TaskRecord

TaskRecord表示任务栈,是真正的一个先进后出的栈结构,用于记录activity开启的先后顺序。其所存放的Activity是不支持重新排序的,只能根据压栈和出栈操作更改Activity的顺序。有了TaskRecord,Android系统才能知道当一个Activity退出时,接下来该显示哪一个Activity。

final class TaskRecord {

/** List of all activities in the task arranged in history order */

final ArrayList mActivities;

}



[](()2.3、ActivityStack

ActivityStack 是TaskRecord的一个分组,用于管理TaskRecord列表,列表中的TaskRecord可以重排顺序。

final class ActivityStack {

/**

  • The back history of all previous (and possibly still

  • running) activities. It contains #TaskRecord objects.

*/

private ArrayList mTaskHistory = new ArrayList<>();

}



[](()2.3.1 TaskRecord、ActivityStack关系。

通常情况下,一个App对应一个ActivityStack,ActivityStatck中会有一个TaskRecord列表,通常列表中仅有一个TaskRecord,维护Activity栈。

img

image

一个Activity启动时,归属的TaskRecord,通常是启动它的Activity 对应的TaskRecord。

如ActivtiyA启动ActivityB,那么ActivityB会被保存在ActivityA所属的TaskRecord中。

img

image

当一个Activity的launchmode 设置了SingleIntance,那么它启动的时候就会新建一个TaskRecord,这时ActvityStack中就会存在多个TaskRecord 栈结构。

img

image

当设置了Intent.FLAG_ACTIVITY_NEW_TASK和taskAffinity时,可能会出现多个app共享同一个ActivityStack的情况。

taskAffinity 可以指定Activity需要宿主TaskRecord的名字,当ActivityManagerService发现启动了一个带有 FLAG_ACTIVITY_NEW_TASK 标签的 Activity 时,会先去查找当前AMS中是否存在activity需要的ActivityStack和TaskRecord,如果存在则直接将ActivityRecord添加到对应ActivityStack的TaskRecord中去,否则会先新建一个TaskRecord,然后将ActvityRecord添加到新建的TaskRecord中。

adb shell dumpsys activity 查看activity栈的请款

ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)

Display #0 (activities from top to bottom):

Stack #1:

TaskRecord{4212758 #173 A=com.sogou.iot.testtouch1 U=0 StackId=1 sz=2}

Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.sogou.iot.testtouch1/.MainActivity }

Hist



版权声明:本文为m0_67598977原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。