一张图看懂setContentView解析布局流程

时间:2021-7-20 作者:qvyue
一张图看懂setContentView解析布局流程
setContentView源码分析.png

高清图片地址:https://www.edrawsoft.cn/viewer/public/s/max/aafc5037041214

前言:

关于Android系统源码这一块, 我发现很多技术博客都是把部分源码贴出来, 然后进行讲解. 我们学习的时候一边看博客, 一边看源码。 但是我发现一下几个问题:
1. 系统源码的执行顺序本来就是跳来跳去的, 有时候一个方法执行下去,直接回不来了, 不记得回到那儿了, 分叉路口太多,需要反复从头看, 看多了熟悉了以后就知道跳哪儿了.

2. 即使现在看懂了,但是太久不用, 也很容易忘记执行的顺序,毕竟源码中的分叉路口比较多, 经常要从头一点一点找源码. 有时候自己写的代码,太久不看都容易忘, 更别说系统源码了.

以上是我发现的几个问题. 所以我觉得用图形来辅助记忆, 效果会更好一些, 把主要执行顺序记录即可, 其它细节可以慢慢再看.

这里只是介绍了总体流程, 对着图, 先把总体流程走通,细节再慢慢看

一. 启动App, 看ActivityThreadc.class

AMS看成是黑盒子, 先不管.
通过AMS执行到ActivityThread.performLaunchActivity(), 做了两件事:

  1. 反射获取Activity对象.
  2. 执行activity.attach(), window = new PhoneWindow();

二. 继承Activity和AppCompatActivity的执行顺序是不一样的.

  1. Activity直接就执行PhoneWindow的方法。
  2. AppCompatActivity则加了很多东西.
    无论哪个, 最终都会走PhoneWindow.setContentView(); 所以先看这个方法。

三. 看图PhoneWindow.class

1. setContentView()方法.
①. installDecor(); 初始化DecorView.
②. 将我们的布局添加到 mContentParent.

2. installDecor()方法.
①. new Decor对象
②. Decor.add(系统布局)
③ mContentParent 其实就是 系统布局中id为R.id.content的控件.

四. 继承AppCompatActivity的情况, 看图 AppCompatDelegateImpl.class

setContentView()—>ensureSubDecor()—>createSubDecor()
1. createSubDecor()方法.
第5步设置id.
①. 把PhoneWindow中的控件id = R.id.content(16908290)换成了-1
② 把新的系统布局subDecor,id换成了R.id.content(16908290)

2. setContentView()方法.
第2步查找控件 ViewGroup contentParent = mSubDecor.findViewById(android.R.id.content);
实际上是去新的布局去找.

五. 看图 LayoutInflater.class

总的来说,就是通过XmlPullParser循环递归xml文件, 通过反射获取View对象, 用map进行保存.

快要回家过年了, 时间比较赶, 只能写到这儿了, 如果有什么更好的建议, 欢迎提出,如果觉得对你有帮助, 点赞收藏.

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。