首先我们要了解什么是Activity、Window和View。
Activity:Activity有是包含了SetContentView()和attach()两个方法,Activity包含一个Window,该Window在Activity的attach方法中通过调用PolicyManager.makeNewWindow创建。
Window: 表示一个窗口,不一定有屏幕那么大,可以很大也可以很小;
它包含一个View tree和窗口的layout 参数。
View tree的root View可以通过getDecorView得到。还可以设置Window的Content View。
View:最基本的UI组件,表示屏幕上的一个矩形区域。
Activity.setContentView来调用Window.setContentView
类及方法调用关系如下图:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN0LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX1kTbZxmWzI2cKhlW3Z1MjZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zN5IzNykTM5EzNyIDM1EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
Activity内有两个方法,setContentView()和attach()
setContentView()设置与Activity相关联的界面试图的,它有三个重载方法
attach()方法在Activity构造的时候就开始调用,在attach()里用到一个对象PolicyManager,PolicyManager实际上是调用的Policy。
Policy里有一个PhoneWindow makeNewWindow(Content context)生成一个新窗体,是一个继承于Window类下面的phoneWindow的类的实例,makeNewWindow的这个方法实在IPolicy里就定义到的。
生成的PhoneWindow里面又有setContentView()方法,setContentView()方法里添加了ContentView,有两种方式,一种是addView()方式来添加;另一种是通过layoutInflater的方式,从xml文件里压过来,压成一个View实例,用到了反射。
结论:
1.Activity 构造的时候调用了attach,绑定了一个window
2.Activity setContentView(),是window.setContentView()
等同的两种方法
setContantView(R.layout.activity_main);
this.getWindow().setContentView(this.getLayoutInflater().inflate(R.layout.activity_main, null));//压进来就是一个根控件,所以用null