Android 面試(八):說說 Activity、View、Window 之間的關(guān)系吧

連載內(nèi)容鎮(zhèn)樓:
Android 面試(一):說說 Android 的四種啟動(dòng)模式
Android 面試(二):如何理解 Activity 的生命周期
Android 面試(三):用廣播 BroadcastReceiver 更新 UI 界面真的好嗎?
Android 面試(四):Android Service 你真的能應(yīng)答自如了嗎?
Android 面試(五):探索 Android 的 Handler
Android 面試(六):你已經(jīng)用 SharedPrefrence 的 apply() 替換 commit() 了嗎?
Android 面試(七):Serializable 這么牛逼,Parcelable 要你何用?

寫在前面

面試系列已經(jīng)相隔很久沒更新了,主要是因?yàn)槟蠅m近期搞的「模擬面試」活動(dòng)花費(fèi)了太多時(shí)間,所以對(duì)我的廣大讀者朋友們深表歉意,不過現(xiàn)在開始依然是一有時(shí)間就會(huì)更新的。畢竟金三銀四,想必想換東家的小伙伴也是比比皆是。

面試場(chǎng)景

什么是 Activity、View、Window?

Activity 是四大組件之一,也是我們的界面載體,可以展示頁面;而 View 實(shí)際上就是一個(gè)一個(gè)的視圖,這些視圖可以搭載在一個(gè) Layout 文件上,通過 Activity 的 setContentView() 方法傳遞給 Activity;Window 是一個(gè)窗體,每個(gè) Activity 對(duì)應(yīng)一個(gè) Window,通常我們?cè)诖a中用 getWindow() 來獲取它。

你是怎樣理解它們?nèi)咧g的關(guān)系的?

Activity 像一個(gè)工匠 ( 控制單元 ),Window 像窗戶 ( 承載模型 ),View 像窗花( 顯示視圖 ) LayoutInflater 像剪刀,Xml 配置像窗花圖紙。

比喻挺生動(dòng),請(qǐng)問可以通俗一點(diǎn)么?

Activity 下裝了一個(gè) Window,Window 下裝了 View,呃...

正文

這是我在「模擬面試」活動(dòng)中一個(gè)真實(shí)的場(chǎng)景,應(yīng)試者的答案并不能忽悠到我,因?yàn)檫@個(gè)答案網(wǎng)上早就傳遍了,但一旦稍微變動(dòng)一下,應(yīng)試者的表現(xiàn)就差強(qiáng)人意,很明顯,這位小伙伴沒對(duì)源碼進(jìn)行更加深刻的理解,而只是簡單地背下了答案。

我們來直接看看實(shí)戰(zhàn)中的代碼,相信大家都知道 Activity 通過 setContentView() 方法來加載布局,我們來看看 setContentView() 方法到底是怎樣做的。

實(shí)際上是 getWindow().setContentView() 做的處理,那這個(gè) getWindow()

你想的沒錯(cuò),這個(gè) mWindow 實(shí)際上就是 PhoneWindow。Window 是一個(gè)抽象類,而 PhoneWindow 實(shí)際上就是 Window 的實(shí)現(xiàn)繼承類。我們直接看看 PhoneWindow 的 setContentView() 方法,看看會(huì)有什么新發(fā)現(xiàn)?

先判斷了 mContentParent 是否為空,這個(gè) mContentParent 是什么玩意兒?

這個(gè) mContentParent 是一個(gè) ViewGroup 對(duì)象,而從注釋中可以明顯地看到 Window 中的內(nèi)容就放置在這里。如果為空,則直接執(zhí)行 installDecor(),這里想都不用想都知道是在實(shí)例這個(gè) mContentParent,我們可以直接進(jìn)入源碼來驗(yàn)證我們的猜想。

這里代碼挺多,我就不截完了,但邏輯不難,我們先判斷 mDecor 是否為 null,如果是,則直接初始化它。然后判斷 mContentParent 是否為 null,如果是,則直接通過 mDecor 去初始化 mContentParent。

這塊其實(shí)講到這里大家就差不多了解了,這個(gè)問題也就不那么難答。

每個(gè) Activity 包含了一個(gè) Window 對(duì)象,這個(gè)對(duì)象是由 PhoneWindow 做的實(shí)現(xiàn)。而 PhoneWindow 將 DecorView 作為了一個(gè)應(yīng)用窗口的根 View,這個(gè) DecorView 又把屏幕劃分為了兩個(gè)區(qū)域:一個(gè)是 TitleView,一個(gè)是 ContentView,而我們平時(shí)在 Xml 文件中寫的布局正好是展示在 ContentView 中的。

用個(gè)圖展示一下。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容