美文网首页Android开发Android进阶之路Android技术知识
一张图看懂setContentView解析布局流程

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

作者: liys_android | 来源:发表于2021-02-09 21:17 被阅读0次
    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进行保存.

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

    相关文章

      网友评论

        本文标题:一张图看懂setContentView解析布局流程

        本文链接:https://www.haomeiwen.com/subject/prjcxltx.html