
在上圖中可以看出,每個Activity都與一個Window(具體來說是PhoneWindow)相關(guān)聯(lián),用戶界面則由Window所承載,而PhoneWindow又與DecorView關(guān)聯(lián)起來。
在講PhoneWindow之前,我們先來了解一下Android的Window!
Window
Window即窗口,這個概念在Android Framework中的實現(xiàn)為android.view.Window這個抽象類,這個抽象類是對Android系統(tǒng)中的窗口的抽象。在介紹這個類之前,我們先來看看究竟什么是窗口呢?
實際上,窗口是一個宏觀的思想,它是屏幕上用于繪制各種UI元素及響應(yīng)用戶輸入事件的一個矩形區(qū)域。通常具備以下兩個特點:
獨立繪制,不與其它界面相互影響;
不會觸發(fā)其它界面的輸入事件;
在Android系統(tǒng)中,窗口是獨占一個Surface實例的顯示區(qū)域,每個窗口的Surface由WindowManagerService分配。我們可以把Surface看作一塊畫布,應(yīng)用可以通過Canvas或OpenGL在其上面作畫。畫好之后,通過SurfaceFlinger將多塊Surface按照特定的順序(即Z-order)進(jìn)行混合,而后輸出到FrameBuffer中,這樣用戶界面就得以顯示。
android.view.Window這個抽象類可以看做Android中對窗口這一宏觀概念所做的約定,而PhoneWindow這個類是Framework為我們提供的Android窗口概念的具體實現(xiàn)。接下來我們先來介紹一下android.view.Window這個抽象類。
這個抽象類包含了三個核心組件:
WindowManager.LayoutParams: 窗口的布局參數(shù);
Callback: 窗口的回調(diào)接口,通常由Activity實現(xiàn);
ViewTree: 窗口所承載的控件樹。
下面我們來看一下Android中Window的具體實現(xiàn)(也是唯一實現(xiàn))——PhoneWindow。
PhoneWindow
PhoneWindow這個類是Framework為我們提供的Android窗口的具體實現(xiàn)。我們平時調(diào)用setContentView()方法設(shè)置Activity的用戶界面時,實際上就完成了對所關(guān)聯(lián)的PhoneWindow的ViewTree的設(shè)置。我們還可以通過Activity類的requestWindowFeature()方法來定制Activity關(guān)聯(lián)PhoneWindow的外觀,這個方法實際上做的是把我們所請求的窗口外觀特性存儲到了PhoneWindow的mFeatures成員中,在窗口繪制階段生成外觀模板時,會根據(jù)mFeatures的值繪制特定外觀。
DecorView
DecorView是一個應(yīng)用窗口的根容器,它本質(zhì)上是一個FrameLayout。DecorView有唯一一個子View,它是一個垂直LinearLayout,包含兩個子元素,一個是TitleView(ActionBar的容器),另一個是ContentView(窗口內(nèi)容的容器)。關(guān)于ContentView,它是一個FrameLayout(android.R.id.content),我們平常用的setContentView就是設(shè)置它的子View。
Activity的setContentView()實際上調(diào)用到了PhoneWindow的setContentView()方法,代碼如下:
參考鏈接:http://www.itdecent.cn/p/060b5f68da79