Android 中的setContentView源码解析

一个Activity在启动的时候,都会在onCreat()方法中执行setContentView(R.layout.activity_main)这行代码,来将指定的资源xml文件加载到对应的activity中,那么它究竟是做了什么操作呢?下面就跟大家一起来看一下源码。(本文所讲是以继承Activity,为例,并不是AppCompatActivity)点击setContentView(R.layout.activity_main)这行代码,进入到Activity类里。

我们发现setContentView实际上是调用的Window的setContentView方法
屏幕快照 2019-08-11 上午11.29.56.png

继续追踪,getWindow()返回的mWindow为PhoneWindow对象


屏幕快照 2019-08-11 上午11.31.54.png

好,我们找到PhoneWindow里面的setContentView()方法,注意里面的installDecor()这个方法。在这个方法里new 了一个DecorView对象。
1565494597761.jpg

将传入的layoutResID加载到mContentParent里面,那么mContentParen又是谁呢?
我们追踪到installDecor()这个方法里面,发现是generateLayout(mDecor)这个方法赋值。继续追踪这个方法。


屏幕快照 2019-08-11 上午11.38.42.png

注意这个方法的这里,他将R.layout.screen_simple这个资源xml加载到了DecorView里面


屏幕快照 2019-08-11 上午11.39.29.png

这就是R.layout.screen_simple这个资源xml,可以看到是一个垂直的线性布局,上面的ViewStub就是咱们的appBar,下面的FrameLayout的id为content!,咱们所加载的activity xml页面就是加载到这个布局里面。


屏幕快照 2019-08-11 上午11.40.26.png

看一下mDecor.onResourcesLoaded(mLayoutInflater, layoutResource)这行代码:


屏幕快照 2019-08-11 上午11.41.57.png

root这个View所代表的的就是 R.layout.screen_simple,然后DecorView调用addView将root加载到DecorView里面。最后下图就是我们Android的activity界面的构成,咱们所有的界面都在黄色区域中,FrameLayout的ID为content。

接下来我们总结一下:

View 是如何被添加到屏幕上的
1.创建顶层布局容器 DecorView
2.在顶层布局容器中加载基础布局ViewGroup
3.将ContentView添加到基础布局中的@android:id/content Framlayout中

屏幕快照 2019-08-11 上午10.41.33.png

总结流程图:

屏幕快照 2019-08-11 上午11.48.01.png

以上仅为个人见解,如有错误或者疑问请大家随时指出。

你可能感兴趣的:(Android 中的setContentView源码解析)