ContentView流程

????????DecorView是一個應(yīng)用窗口的根容器泄朴,它本質(zhì)上是一個FrameLayout罢吃。DecorView有唯一一個子View,它是一個垂直LinearLayout宴偿,包含兩個子元素湘捎,一個是TitleView(ActionBar的容器),另一個是ContentView(窗口內(nèi)容的容器)窄刘。

????????關(guān)于ContentView窥妇,它是一個FrameLayout(android.R.id.content),我們平常用的setContentView就是設(shè)置它的子View娩践。上圖還表達(dá)了每個Activity都與一個Window(具體來說是PhoneWindow)相關(guān)聯(lián)活翩,用戶界面則由Window所承載烹骨。

????????Window即窗口,這個概念在Android Framework中的實(shí)現(xiàn)為android.view.Window這個抽象類材泄,這個抽象類是對Android系統(tǒng)中的窗口的抽象沮焕。在介紹這個類之前,我們先來看看究竟什么是窗口呢拉宗?

????????實(shí)際上峦树,窗口是一個宏觀的思想,它是屏幕上用于繪制各種UI元素及響應(yīng)用戶輸入事件的一個矩形區(qū)域旦事。通常具備以下兩個特點(diǎn):

? ? ? ? 1魁巩、獨(dú)立繪制,不與其它界面相互影響族檬;

? ? ? ? 2歪赢、不會觸發(fā)其它界面的輸入事件;

????在Android系統(tǒng)中单料,窗口是獨(dú)占一個Surface實(shí)例的顯示區(qū)域暑竟,每個窗口的Surface由WindowManagerService分配碟摆。我們可以把Surface看作一塊畫布,應(yīng)用可以通過Canvas或OpenGL在其上面作畫。畫好之后盆昙,通過SurfaceFlinger將多塊Surface按照特定的順序(即Z-order)進(jìn)行混合婆瓜,而后輸出到FrameBuffer中桦沉,這樣用戶界面就得以顯示定枷。

????????android.view.Window這個抽象類可以看做Android中對窗口這一宏觀概念所做的約定,而PhoneWindow這個類是Framework為我們提供的Android窗口概念的具體實(shí)現(xiàn)沉颂。接下來我們先來介紹一下android.view.Window這個抽象類条摸。

????????這個抽象類包含了三個核心組件:

? ? ? ? 1、WindowManager.LayoutParams: 窗口的布局參數(shù)铸屉;

? ? ? ? 2钉蒲、Callback: 窗口的回調(diào)接口,通常由Activity實(shí)現(xiàn)彻坛;

? ? ? ? 3顷啼、ViewTree: 窗口所承載的控件樹。

Android中Window的具體實(shí)現(xiàn)(也是唯一實(shí)現(xiàn))——PhoneWindow昌屉。

????????PhoneWindow這個類是Framework為我們提供的Android窗口的具體實(shí)現(xiàn)钙蒙。我們平時調(diào)用setContentView()方法設(shè)置Activity的用戶界面時,實(shí)際上就完成了對所關(guān)聯(lián)的PhoneWindow的ViewTree的設(shè)置间驮。我們還可以通過Activity類的requestWindowFeature()方法來定制Activity關(guān)聯(lián)PhoneWindow的外觀躬厌,這個方法實(shí)際上做的是把我們所請求的窗口外觀特性存儲到了PhoneWindow的mFeatures成員中,在窗口繪制階段生成外觀模板時竞帽,會根據(jù)mFeatures的值繪制特定外觀烤咧。

????????setContentView()方法只是完成了Activity的ContentView的創(chuàng)建偏陪,而并沒有執(zhí)行View的繪制流程。當(dāng)我們自定義Activity繼承自android.app.Activity時候煮嫌,調(diào)用的setContentView()方法是Activity類的,源碼如下:

setContentView方法

????????getWindow()方法會返回Activity所關(guān)聯(lián)的PhoneWindow抱虐,也就是說昌阿,實(shí)際上調(diào)用到了PhoneWindow的setContentView()方法,源碼如下:

PhoneWindow中的setContentView方法

????????LayoutInflater.inflate()

????????PhoneWindow的setContentView()方法中調(diào)用了LayoutInflater的inflate()方法來填充布局恳邀,這個方法的源碼如下:

????????在PhoneWindow的setContentView()方法中傳入了decorView作為LayoutInflater.inflate()的root參數(shù)懦冰,我們可以看到,通過層層調(diào)用谣沸,最終調(diào)用的是inflate(XmlPullParser, ViewGroup, boolean)方法來填充布局刷钢。這個方法的源碼如下:

先對merge標(biāo)簽進(jìn)行單獨(dú)處理,調(diào)用rInflate()方法來遞歸填充布局乳附。這個方法的源碼如下:

????????上面的inflate()和rInflate()方法中都調(diào)用了rInflateChildren()方法内地,這個方法的源碼如下:

rInflateChildren()方法實(shí)際上調(diào)用了rInflate()方法。setContentView()的整體執(zhí)行流程我們就分析完了赋除,至此我們已經(jīng)完成了Activity的ContentView的創(chuàng)建與設(shè)置工作阱缓。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市举农,隨后出現(xiàn)的幾起案子荆针,更是在濱河造成了極大的恐慌,老刑警劉巖颁糟,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件航背,死亡現(xiàn)場離奇詭異,居然都是意外死亡棱貌,警方通過查閱死者的電腦和手機(jī)玖媚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來键畴,“玉大人最盅,你說我怎么就攤上這事∑鹛瑁” “怎么了涡贱?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長惹想。 經(jīng)常有香客問我问词,道長,這世上最難降的妖魔是什么嘀粱? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任激挪,我火速辦了婚禮辰狡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垄分。我一直安慰自己宛篇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布薄湿。 她就那樣靜靜地躺著叫倍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪豺瘤。 梳的紋絲不亂的頭發(fā)上吆倦,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機(jī)與錄音坐求,去河邊找鬼蚕泽。 笑死,一個胖子當(dāng)著我的面吹牛桥嗤,可吹牛的內(nèi)容都是我干的须妻。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼砸逊,長吁一口氣:“原來是場噩夢啊……” “哼璧南!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起师逸,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤司倚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后篓像,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體动知,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年员辩,在試婚紗的時候發(fā)現(xiàn)自己被綠了盒粮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡奠滑,死狀恐怖丹皱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宋税,我是刑警寧澤摊崭,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站杰赛,受9級特大地震影響呢簸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一根时、第九天 我趴在偏房一處隱蔽的房頂上張望瘦赫。 院中可真熱鬧,春花似錦蛤迎、人聲如沸忘苛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胸遇。三九已至,卻和暖如春逗威,著一層夾襖步出監(jiān)牢的瞬間凯旭,已是汗流浹背罐呼。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工奉呛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞧壮,地道東北人谊娇。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓赠堵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親揍愁。 傳聞我的和親對象是個殘疾皇子莽囤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容