1.window類
爲一個抽象類,提供繪製窗口的一組通用api,可以將之理解爲一個載體,各種view在這個載體上顯示
2.phoneWindow
2.1該類繼承於window類,是window類的具體實現,我們可以通過該類具體去繪製窗口。
2.2 該類包含了一個DecorView對象,DecorView是所有應用窗口的根view
2.3 簡而言之,phonewindow類是吧一個FrameLayout類即DecorView對象進行包裝。在phoneWindow
部分源碼
3.DecorView類
3.1 該類是phoneWindow類的內部類,是FrameLayout的子類,是一個裝飾的view,比如說title,titleBar,最主要的一點是,它是所有應用窗口的根view
3.2 decorview只有一個子元素爲LinearLayout,代表整個應用界面,包含通知欄,標題欄,內容顯示欄三塊區域
3.3 LinearLayout裏面有兩個FrameLayout子元素 20,爲標題欄顯示界面,21爲內容顯示界面,就是setcontentView()方法載入的佈局界面。
4.Activit調用setContentView(intresId)過程
4.1 從上圖可以看出,Activity.setContentView(int layoutResId) 是在PhoneWindow(Window的實現類)中完成。
4.2 在phoneWindow的setcontentView(int resId)中,如果setContentView是第一次加載,則會調用installDecor(),此方法是創建DecorView,即根視圖,如果不是第一次調用setcontentView,則removeAllViews內容中的所有視圖,
這就解釋了設置titleBar,是否有標題,是否全屏,都要在setContentView之前執行,因爲第一次setContentView,DecorView就已經建立