android源码分析之setcontentview如何将UI文
在activity的oncreate方法中,都要setcontentview去设置一个布局文件,那我们由这里为起点开始研究之旅
进入到Activity如图1,找寻getWindow发现,window为一个抽象类,其唯一实现为PhoneWindow类如图2
![](https://img.haomeiwen.com/i3587320/74e796712f355858.png)
![](https://img.haomeiwen.com/i3587320/dc1326bd9a0a2c05.png)
一、关注圈出来的两个方法,如图3,第一个方法是系统的各种布局;第二个是自己写的方法布局,其中自己的写的xml经过解析,放入了LayoutParams
![](https://img.haomeiwen.com/i3587320/51daa5469d5fce42.png)
图4的第一个方法为一些初始化,重点关注第二个方法,
![](https://img.haomeiwen.com/i3587320/1ec62ea3444cce9d.png)
generatelayout方法中是一系列requestFeature方法,如图5
![](https://img.haomeiwen.com/i3587320/325efcdaeb94eae9.png)
![](https://img.haomeiwen.com/i3587320/57a61398b7728ab8.png)
真正加载layout中布局的代码如图7
![](https://img.haomeiwen.com/i3587320/715d949b8952997b.png)
二、将布局绘制到页面
在ActivityThread的handleMessage方法中,找到relauch的,进一步获得图8
![](https://img.haomeiwen.com/i3587320/b580226849f3e0af.png)
通过ClientTransactionHandler 中的scheduleTransaction(ClientTransaction transaction)这个方法,发送消息,ActivityThread的handleMessage()中处理消息,mTransactionExecutor.execute(transaction)
![](https://img.haomeiwen.com/i3587320/d45201db4e607cda.png)
![](https://img.haomeiwen.com/i3587320/487090ac6d48cd38.png)
![](https://img.haomeiwen.com/i3587320/41941758e6240563.png)
![](https://img.haomeiwen.com/i3587320/8685141f36c4fb41.png)
![](https://img.haomeiwen.com/i3587320/faca0af0f7f58357.png)
如下图发现 addView方法是接口ViewManager中的方法,肯定会有一个地方去实现他,就在ActivityThread中
![](https://img.haomeiwen.com/i3587320/72e733e86323b4c4.png)
![](https://img.haomeiwen.com/i3587320/335f1e0175df00e9.png)
ViewManager是个接口,我们要找getWindowManager()方法进去继续查找实现
![](https://img.haomeiwen.com/i3587320/9dc2ee085765bc03.png)
WindowManager也是个接口,继续查找
![](https://img.haomeiwen.com/i3587320/742c11499e001e0a.png)
![](https://img.haomeiwen.com/i3587320/ee7da610c48e95ff.png)
WindowManageImpl中的addView方法
![](https://img.haomeiwen.com/i3587320/134a006b49a4928d.png)
接近真相的时刻快到了,下图箭头标识方法,很可能就是我们想要的方法
![](https://img.haomeiwen.com/i3587320/bcb0deaeccdca647.png)
如下图是三个容器,装view、root、wparams
![](https://img.haomeiwen.com/i3587320/84b0ea559fbda1ef.png)
![](https://img.haomeiwen.com/i3587320/c93db67acfcdffb9.png)
![](https://img.haomeiwen.com/i3587320/f7c0b07ab87da8c7.png)
![](https://img.haomeiwen.com/i3587320/b39a96503c8de271.png)
![](https://img.haomeiwen.com/i3587320/3f4d6560e94bc6a1.png)
![](https://img.haomeiwen.com/i3587320/e8e09b9146564cc9.png)
measure之后,进行布局的摆放,如下图
![](https://img.haomeiwen.com/i3587320/fb55c44b6cdd94e2.png)
![](https://img.haomeiwen.com/i3587320/fbd5d357655d643e.png)
资源里所有的view依次全部轮循出来,然后每个去requestLayout
![](https://img.haomeiwen.com/i3587320/4acb7c1ce2e01620.png)
![](https://img.haomeiwen.com/i3587320/e9df9ece6d522155.png)
performLayout之后才进行performDraw
![](https://img.haomeiwen.com/i3587320/6c73785743247c8f.png)
![](https://img.haomeiwen.com/i3587320/f5644743d4d05812.png)