一. 应用从启动到onCreate的过程

二. Activity生成过程详细分析
21版本:

三. 核心对象整理
1.ActivityThread
2.ApplicationThread
AMS通信
3.Instrumentation
Application与Activity生命周期管理
4.ClientTransaction
客户端回调事务管理
5.ActivityStackSupervisor
配置信息管理
6.ActivityRecord
Activity配置信息实体,Launcher进程负责解析清单文件传递数据入AMS
7.ClientTransactionItem
LauncherActivityItem:启动
PauseActivityItem:暂停
StopActivityItem:停止
ResumeActivityItem:重新加载
DestroyActivityItem:销毁
三. 源码阅读思路与流程
1.zygote进程fork之后,系统启动ActivityThread
2.ActivityThread准备一个ApplicationThread类
用于去和AMS进行通信。
3.ActivityThead发起一个对于AMS.attachApplication的binder调用
4.回到bindApplication中发生数据组装后的handler调用
5.sendMessage消息转入handlerMessage中
最终调用到handleBindApplication
6.handleBindApplication
a.mInstrumentation生命周期管理对象的构建
b.Application的创建与调用:反射构建Application信息+调用create函数
上述过程完成了Application的创建调用管理过程,接着就是Activity的相关管理。
7.mStackSupervisor.attachApplicationLocked
该类为Activity配置管理
8.验证是否是MainAcitivty

9.进入realStartAcitivityLocked中启动Activity创建
ClientTransactionActivity启动事务管理,首先回封装事务数据,然后进行相关事务提交,事务提交的目的是让人去进行调度。
10.此时回到ApplicationThread.scheduleTransaction的调用
消息发送--EXECUTE_TRANSACTION
11.消息发送接收到后执行mTranscationExecutor.execute(transcation)
12.由performLaunchActivity具体进行反射构建
mInstrumentation.newAcitiy:反射构建具体实体对象
然后进行acitivity.attach:初始化PhoneWindow对象
再调用callAcitivtyOnCreate:activity.onCreate
四. 源码总结
1.Launcher进程会将清单文件中相关配置信息传递数据到AMS
2.AMS负责的管理的是配置信息。
3.Activity启动后会产生一个ApplicationThread通信类对AMS进行通信。
4.AMS接收到attach调用后,将相关配置信息进行筛选,打包后交由事务管理进行回调,事务管理会回调ApplicationTread中相关schedule函数进行通信。
5.所有的具体数据构建的反色构建 由Instrumentation完成。
五. setContentView加载数据的核心概念。
目的:XML信息加载与管理
1.加载基础布局数据
image.png
基础布局实际物理文件地址:SDK安装目录\platforms\android-31\data\res
2.加载用户布局数据
五. setContentView具体源码分析流程。
1.activity.setContentView
这里实际调用的是Window.setContentView
我们可以看到在attach中实际 生产的对象为PhoneWindow,所以我们直接找到对应PhoneWindow.setContentView
2.PhoneWindow.setContentView
这里主要注意两个点:
a.由installDecor()完成基础布局数据加载。

3.PhoneWindow.installDecor
a.构建生成一个DecorView对象。
b.获取到基础布局当中的内容部分
mContentparent = generatelayout(mDecor);

2)根据主题不同,进行选择不同的基础布局文件进行解析

3)这里以R.layout.screen_simple为例

4)mDecor.onResourcesLoaded(mLayoutInflater,layoutResource)对该文件进行XML解析

两个结论:

2.mContentParent为紫色部分,也就是基础布局文件中的id为content这个视图
4.用户数据加载
mLayoutInflater.inflate(layoutResId,mContentParent)
5.具体解析流程
a.根据文件获取解析器
b.创建根节点View

c.解析下级View

d.将根节点添加到DecorView

五. 源码总结
总结:整个setContentView就是在做两件事情
网友评论