要说这个问题Activity与Window及View之间的关系,首先讲解下Activity是怎么显示布局的。我们知道通过setContentView或者LayoutInflater可以加载一个布局到Activity上,那么这个过程是怎样执行的呢?
执行setContentView的时候,进入Activity里面的源码可以知道,这个方法是Window对象执行的,也就是说Activity是没有办法直接处理View的,而是通过Window对象来显示的,关联源码可以知道Window对象是抽象类,这个时候通过Debug模式可以知道Window的具体实现时PhoneWindow,在PhoneWindow里面实现了setContentView方法。通过setContentView(layoutResID)设置布局,也使用了LayoutInflater来动态加载布局的。
第二个问题:Window对象是怎么被创建的呢?
就是Activity加载的时候,会执行Activity里面的attach方法,这里对Window对象进行初始化,这里的attach方法必须比onCreate方法优先调用,因为在onCreate方法里面要执行setContentView方法,要先有Window对象才能调用setContentView方法。
第三个问题:View对象最后添加到哪去了呢?
在setContentView的参数里面,会获取到一个View对象,然后会把这个View对象添加到一个ViewGroop(mContentParent)中。
注意事项:
1、PhoneWindow才是实例化View的对象。
2、一个Activity对应着一个PhoneWindow,所以Acitity是在创造窗体,它本身并不能处理View的操作。
3、DecorView是一个顶级的View,它包含整个布局,在HiaracyViewer可以看得出来。