Android視窗機制分析與UI管理系統
類圖關係
在看Android的視窗機制之前,先看看其主要的類圖關係以及層級之間的依賴與呼叫關係
1.window在當前的android系統的中的呈現形式是PhoneWindow
(frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindow.java);
2.WindowManager的實現實體是WindowManagerImpl.java
(frameworks/base/core/java/android/view/WindowManagerImpl.java);
層級關係
下圖主要描述了window系統的層級關係,由圖可見WindowManager是執行在Application process中,
ViewRoot類
ViewRoot是GUI管理系統與GUI呈現系統之間的橋樑,根據ViewRoot的定義,我們發現它並不是一個View型別,而是一個Handler。
主要作用如下:
- 向DecorView分發收到的使用者發起的event事件,如按鍵,觸屏,軌跡球等事件;
- 與WindowManagerService互動,完成整個Activity的GUI的繪製。
在完成Activity的ContentView設定之後,下面的工作就是準備顯示了,準備顯示的主要工作就是建立起Application和WindowManagerService之間的聯絡,第一步的工作就是向WindowManager新增前面涉及到的DecorView,這個DecorView包含了整個Activity的GUI
UI管理系統
Activity可以看做是整個android系統的人機介面,它提供了一個視窗來繪製UI,每個Activity在啟動時,我們都需要給它設定一個Content view,作為Activity所呈現的UI內容,這個過程是通過setContentView()方法來實現的。
眾所周知,android系統中強化了view的概念,主要是體現在對view的管理上,Android中的view以2種形態存在,單一的View和多個View組成的ViewGroup。Content view是以ViewGroup的形式存在的,也就是說在一個Activity視窗中可以新增多個View,這樣就實現了Android視窗系統的UI多樣化。activity啟動時給activity視窗設定的Content
view 是從xml檔案中解析出來的,那麼android是怎麼樣對這個ContentView進行管理的呢,它的內部實現邏輯又是怎樣的呢?
在進行分析之前,首先看一個Activity的window和view系統的層級關係,這個層級關係就是在Activity設定完ContentView之後的狀況。
各個層級的含義與作用
PhoneWindow
PhoneWindow是Android中的最基本的視窗系統,每個Activity 均會建立一個PhoneWindow物件,是Activity和整個View系統互動的介面。
DecorView
DecorView是當前Activity所有View的祖先,它並不會向用戶呈現任何東西。
它主要有如下幾個功能,可能不全:
- Dispatch ViewRoot分發來的key、touch、trackball等外部事件;
- DecorView有一個直接的子View,我們稱之為System Layout,這個View是從系統的Layout.xml中解析出的,它包含當前UI的風格,如是否帶title、是否帶process bar等。可以稱這些屬性為Window decorations。
- 作為PhoneWindow與ViewRoot之間的橋樑,ViewRoot通過DecorView設定視窗屬性。
System Layout
目前android根據使用者需求預設了幾種UI 風格,通過PhoneWindow通過解析預置的layout.xml來獲得包含有不同Window decorations的layout,我們稱之為System Layout,我們將這個System Layout新增到DecorView中,目前android提供了8種System Layout。
預設風格可以通過PhoneWindow方法requestFeature()來設定,需要注意的是這個方法需要在setContentView()方法呼叫之前呼叫。
Content Parent
Content Parent這個ViewGroup物件才是真正的ContentView的parent,ContentView終於找到了寄主,它其實對應的是System Layout中的id為”content”的一個FrameLayout。這個FrameLayout物件包括的才是Activity的layout(每個System Layout都會有這麼一個id為”content”的一個FrameLayout)。
Activity Layout
這個ActivityLayout便是我們需要向視窗設定的ContentView,現在我們發現其實它的地位很低,同時這一部分才是和user互動的UI部分,其上的幾層並不能響應並完成user輸入所期望達到的目的。