Window、Activity、DecorView以及ViewRoot之間的關係

Activity

Activity並不負責視圖控制,它只是控制生命週期和處理事件。真正控制視圖的是Window。一個Activity包含了一個Window,Window纔是真正代表一個窗口。Activity就像一個控制器,統籌視圖的添加與顯示,以及通過其他回調方法,來與Window、以及View進行交互。

Window

Window是視圖的承載器,內部持有一個 DecorView,而這個DecorView纔是 view的根佈局。Window是一個抽象類,實際在Activity中持有的是其子類PhoneWindow。PhoneWindow中有個內部類DecorView,通過創建DecorView來加載Activity中設置的佈局 R.layout.activity_main 。Window 通過WindowManager將DecorView加載其中,並將DecorView交給ViewRoot,進行視圖繪製以及其他交互。

DecorView

DecorView是FrameLayout的子類,它可以被認爲是Android視圖樹的根節點視圖。DecorView作爲頂級View,一般情況下它內部包含一個豎直方向的LinearLayout,在這個LinearLayout裏面有上下三個部分,上面是個ViewStub,延遲加載的視圖(應該是設置ActionBar,根據Theme設置),中間的是標題欄(根據Theme設置,有的佈局沒有),下面的是內容欄。

ViewRoot

ViewRoot可能比較陌生,但是其作用非常重大。所有View的繪製以及事件分發等交互都是通過它來執行或傳遞的。ViewRoot對應ViewRootImpl類,它是連接WindowManagerService和DecorView的紐帶,View的三大流程(測量(measure),佈局(layout),繪製(draw))均通過ViewRoot來完成。ViewRoot並不屬於View樹的一份子。從源碼實現上來看,它既非View的子類,也非View的父類,但是,它實現了ViewParent接口,這讓它可以作爲View的名義上的父視圖。RootView繼承了Handler類,可以接收事件並分發,Android的所有觸屏事件、按鍵事件、界面刷新等事件都是通過ViewRoot進行分發的。

下面結構圖可以清晰的揭示四者之間的關係:
這裏寫圖片描述

發佈了63 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章