View、Window、Activity的关系

一个Android应用的视图是如何呈现出来呢?

新手可能因为没有接触过Window而认为是Activity或者是View,我在刚开始学习Android 的时候就认为一个Activity就是一个画板一样的东西,但是实际上,视图的真正代表类是Window。所谓的视图代表类的意思就是指真正的绘制工作的实现类。也就是说,Activity本身不负责绘制UI,它是一个中转控制类,我们把View交给他,他负责让Window去绘制我们给它的View,从而让Android呈现出视图,如果一个Activity没有Window,那么它的作用就和Service类似了。

按照这个思路来想,很显然的,一个Acitivity必然持有一个Window的引用以及一套View的控制机制。

Window具体的实现和内容我们不谈,这些东西涉及到底层的真正的绘图的OpenGL这样的玩意,它必然是由C++来实现的。

那么我们的重点就是View的这套控制机制,Activity是如何控制我们交给它的View的?很多书里都都会谈到ViewRoot和DecorView这些东西,但是不明确刚才说的前提的情况下,说了半天也不知道是在干什么。

先简单的说一下Window和Activity:

(1)每一个Activity实例里都存在一个Window实例,在Activity被ActivityThread创建时调用Activity的attch方法将Window实例与Activity实例绑定。

(2)Acitivity调用setContentView方法实际上调用的是Window的setContentView方法。

接下来开始View:

先搞清楚ViewRoot和DecorView两者。

ViewRoot准确的说这个类是ViewRootImpl,它是WindowManagerService和DecorView的连接者,从这个角度来看,它可以说是ViewRoot的更上一层,但是ViewRoot本身没有继承View,它不在View树这个层次里。我们可以把ViewRoot理解为Activity管理View树的中介,事实上,所有的触摸事件、刷新事件都是通过ViewRoot传递给View树。

而DecorView就是View树的顶层了,它继承自FrameLayout,一个Acitivity里的所有View都在这个Decor的下面,DecorView通常包含一个LinearLayout,它的子view是上下两个部分(根据版本不同有区别)。