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

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选取有不同的处理。

猜你喜欢

转载自blog.csdn.net/yuanjw2014/article/details/78072208