Activity並不負責視圖控制,它只是控制生命周期和處理事件。真正控制視圖的是Window。一個Activity包含了一個Window,Window才是真正代表一個窗口。Activity就像一個控制器,統籌視圖的添加與顯示,以及通過其他回調方法,來與Window、以及View進行交互。
Window是視圖的承載器,內部持有一個 DecorView,而這個DecorView才是 view 的根布局。Window是一個抽象類,實際在Activity中持有的是其子類PhoneWindow。PhoneWindow中有個內部類DecorView,通過創建DecorView來載入Activity中設置的布局R.layout.activity_main
。Window 通過WindowManager將DecorView載入其中,並將DecorView交給ViewRoot,進行視圖繪製以及其他交互。
DecorView是FrameLayout的子類,它可以被認為是Android視圖樹的根節點視圖。DecorView作為頂級View,一般情況下它內部包含一個豎直方向的LinearLayout,在這個LinearLayout裡面有上下三個部分,上面是個ViewStub,延遲載入的視圖(應該是設置ActionBar,根據Theme設置),中間的是標題欄(根據Theme設置,有的布局沒有),下面的是內容欄。具體情況和Android版本及主體有關,以其中一個布局為例,如下所示:
在Activity中通過setContentView所設置的布局文件其實就是被加到內容欄之中的,成為其唯一子View,就是上面的id為content的FrameLayout中,在代碼中可以通過content來得到對應載入的布局。
ViewRoot並不屬於View樹的一份子。從源碼實現上來看,它既非View的子類,也非View的父類,但是,它實現了ViewParent介面,這讓它可以作為View的名義上的父視圖。RootView繼承了Handler類,可以接收事件並分發,Android的所有觸屏事件、按鍵事件、界面刷新等事件都是通過ViewRoot進行分發的。