源码阅读---AMS与Activity启动流程

来源:互联网 发布:淘宝三个心要多少好评 编辑:程序博客网 时间:2024/06/05 04:42

AMS中Activity管理相关数据结构

AMS管理着所有应用的Activity记录,在AMS中以栈的形式管理Activity,以stack和task为基本单位,安卓系统支持多屏幕设备(手机屏,投影仪)展示,手机默认展示屏幕是手机屏幕,一个显示设备对应AMS中的一个ActivityDisplay,ActivityDisplay保存有该显示设备上的多个ActivityStack,一般会有两个Stack,一个HomeStack管理launcher应用等系统页面,另一个管理所有的用户应用;ActivityStack保存有所有TaskRecord实例,一个应用会对应一个或多个TaskRecord,TaskRecord以栈的形式存储ActivityRecord记录。AMS对Activity的管理实际上就是对以上数据结构的创建、出入栈、关联、位置调整等操作,此外,还包括与WMS进行同步以保证展示正常,以及与客户端交互完成Activity的生命周期。
这样AMS对Activity的管理分为四个层级,分别是
ActivityDisplay
ActivityStack
TaskRecord
ActivityRecord
类图结构如下

1.类图结构

这里写图片描述

2.Activity栈结构

使用adb命令可以直观的看到AMS中的Activity栈结构
adb shell dumpsys activity
这条命令可以看到AMS中相关的Stack,task以及进程信息
添加activities参数adb shell dumpsys activity activities
可以查看更详细的activity栈信息 以下是一个Activity栈查看结果:

这里写图片描述

这里写图片描述

在默认展示设备上有两个Stack stack0是HomeStack;stack1承载了应用task。

Activity启动流程

基本流程
1.应用端调用startActivity,应用端通过Binder机制调用AMS
2.由应用端参数构造ActivityRecord,包括Intent解析、rourceRecord、result处理(startActivityMayWait、startActivityLocked)
3.根据launchFlag、launchMode、resultTo、intask等确定Activity所属task,task复用,stack等(startActivityUnchecked)
4.把Activity加入到task中,设置相应属性,同步Activity Apptoken到WMS(ActivityStack.startActivityLocked)(WMS里添加应用窗口时已经存在的token就是在这时候添加的)
5.Activity状态管理与生命周期回调,先pause掉当前Activity(下图未画出),再Resume要启动的Activity,

这里写图片描述

Activity的launchMode与Task

Activity有四种基本的加载模式:standard、singleTop、singleTask和singleInstance;在启动Activity时根据launchMode和Intent的launchFlag不同设置,会对Task选取有不同的处理。
1.对于指定了启动Task的情况,要启动的Activity直接放入指定task
2.对于需要返回Result(即以startActivityForResult方法启动)的情况,直接放入sourceRecord所在的Task
3.不满足以上两种情况,launchFlag设置了NEW_TASK且未设置MultiTask 或者是launchMode为singleTask或singleInstance的情况,会复用已有的Task或者启动新的Task。
4.最常见的情况直接在应用中启动次级页面(standard模式),直接放在原Task上

原创粉丝点击