Activity和window太惠,DecorView ,viewRoot是什么關(guān)系,這一篇文章將揭曉疲憋。
一凿渊,職能簡(jiǎn)介
- Activity
- 控制生命周期和處理事件捻勉。
- 統(tǒng)籌視圖的添加與顯示遣总,通過(guò)回調(diào)與Window和View進(jìn)行交互。
- Window
- 子類PhoneWindow丢郊,用于控制視圖
- PhoneWindow中有個(gè)內(nèi)部類DecorView秋忙。通過(guò)創(chuàng)建DecorView來(lái)加載R.layout.activity_main彩掐。
- Window通過(guò)WindowManager將DecorView加載其中,并將DecorView交給ViewRoot灰追,進(jìn)行視圖繪制以及其他交互堵幽。
- DecorView
- DecorView的父類是FrameLayout,是Android View樹(shù)的根節(jié)弹澎。
- 內(nèi)部包含一個(gè)豎直方向的LinearLayout朴下,它有上下三個(gè)部分,上面是個(gè)ViewStub苦蒿,延遲加載的視圖(ActionBar殴胧,根據(jù)Theme設(shè)置),中間的是標(biāo)題欄(根據(jù)Theme設(shè)置,有的布局沒(méi)有)团滥,下面的是內(nèi)容欄竿屹。 setContentView所設(shè)置的布局文件其實(shí)就是被加到內(nèi)容欄之中的。
- ViewGroup content = (ViewGroup)findViewById(android.R.id.content);
- ViewGroup rootView = (ViewGroup) content.getChildAt(0);
- ViewRoot
控制View的事件處理和邏輯處理灸姊。
ViewRoot子類是ViewRootImpl類拱燃,它是連接WindowManagerService和DecorView的紐帶,View的三大流程(測(cè)量(measure)厨钻,布局(layout)扼雏,繪制(draw))均通過(guò)ViewRoot來(lái)完成。
ViewRoot并不屬于View樹(shù)的一部分夯膀。從源碼實(shí)現(xiàn)上來(lái)看诗充,它既非View的子類,也非View Group诱建,但它實(shí)現(xiàn)了ViewParent接口蝴蜓,這讓它可以作為View的名義上的父視圖。
RootView繼承了Handler類俺猿,可以接收事件并分發(fā)茎匠。
Android的所有觸屏事件、按鍵事件押袍、界面刷新等事件都是通過(guò)ViewRoot進(jìn)行分發(fā)的诵冒。
-
三者之間的關(guān)系
二,DecorView的創(chuàng)建
這部分內(nèi)容主要講DecorView是怎么一層層嵌套在Actvity谊惭,PhoneWindow中的汽馋,以及DecorView如何加載內(nèi)部布局。
- setContentView
- 先是從Activity中的setContentView()開(kāi)始
- getWindow().setContentView(layoutResID);
- 實(shí)際是交給Window裝載視圖
- 先是從Activity中的setContentView()開(kāi)始
- Activity是怎么獲得Window對(duì)象的?在Activity中的attach()方法中圈盔,生成了PhoneWindow實(shí)例豹芯。
-
設(shè)置DecorView給Window對(duì)象。
三驱敲, DecorView的顯示
-
通過(guò)setContentView()設(shè)置的界面铁蹈,為什么在onResume()之后才對(duì)用戶可見(jiàn)呢?
* ActivityThread 的handleResumeActivity()方法調(diào)用Activity.makeVisible()方法众眨。
-
以上的ViewManager調(diào)用addView創(chuàng)建ViewRootImpl握牧,然后調(diào)用performTraversals()方法,然后完成繪制娩梨。
以上就是對(duì)Activity我碟,window,DecorView姚建,viewRoot的介紹,以及DecorView的創(chuàng)建和顯示吱殉。