天天看点

android中Activity、Window 和 View的关系

首先我们要了解什么是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

类及方法调用关系如下图:

android中Activity、Window 和 View的关系

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

继续阅读