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

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

寫在前面

面試系列已經(jīng)相隔很久沒更新了实蔽,主要是因為南塵近期搞的「模擬面試」活動花費了太多時間荡碾,所以對我的廣大讀者朋友們深表歉意,不過現(xiàn)在開始依然是一有時間就會更新的局装。畢竟金三銀四坛吁,想必想換東家的小伙伴也是比比皆是。

面試場景

什么是 Activity铐尚、View拨脉、Window?

Activity 是四大組件之一,也是我們的界面載體宣增,可以展示頁面玫膀;而 View 實際上就是一個一個的視圖,這些視圖可以搭載在一個 Layout 文件上爹脾,通過 Activity 的 setContentView() 方法傳遞給 Activity匆骗;Window 是一個窗體劳景,每個 Activity 對應(yīng)一個 Window,通常我們在代碼中用 getWindow() 來獲取它碉就。

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

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

比喻挺生動碉熄,請問可以通俗一點么桨武?

Activity 下裝了一個 Window,Window 下裝了 View锈津,呃...

正文

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

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

實際上是 getWindow().setContentView() 做的處理刽脖,那這個 getWindow()羞海?

你想的沒錯,這個 mWindow 實際上就是 PhoneWindow曲管。Window 是一個抽象類却邓,而 PhoneWindow 實際上就是 Window 的實現(xiàn)繼承類。我們直接看看 PhoneWindow 的 setContentView() 方法翘地,看看會有什么新發(fā)現(xiàn)?

先判斷了 mContentParent 是否為空癌幕,這個 mContentParent 是什么玩意兒衙耕?

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

這里代碼挺多饰潜,我就不截完了,但邏輯不難和簸,我們先判斷 mDecor 是否為 null彭雾,如果是,則直接初始化它锁保。然后判斷 mContentParent 是否為 null薯酝,如果是,則直接通過 mDecor 去初始化 mContentParent爽柒。

這塊其實講到這里大家就差不多了解了吴菠,這個問題也就不那么難答。

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

用個圖展示一下嗓化。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末棠涮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子刺覆,更是在濱河造成了極大的恐慌严肪,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谦屑,死亡現(xiàn)場離奇詭異驳糯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)氢橙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門酝枢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悍手,你說我怎么就攤上這事帘睦。” “怎么了坦康?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵竣付,是天一觀的道長。 經(jīng)常有香客問我滞欠,道長古胆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任筛璧,我火速辦了婚禮逸绎,結(jié)果婚禮上惹恃,老公的妹妹穿的比我還像新娘。我一直安慰自己棺牧,他們只是感情好巫糙,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著陨帆,像睡著了一般曲秉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疲牵,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天承二,我揣著相機(jī)與錄音,去河邊找鬼纲爸。 笑死亥鸠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的识啦。 我是一名探鬼主播负蚊,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼颓哮!你這毒婦竟也來了家妆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤冕茅,失蹤者是張志新(化名)和其女友劉穎伤极,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姨伤,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡哨坪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了乍楚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片当编。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖徒溪,靈堂內(nèi)的尸體忽然破棺而出忿偷,到底是詐尸還是另有隱情,我是刑警寧澤臊泌,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布鲤桥,位于F島的核電站,受9級特大地震影響缺虐,放射性物質(zhì)發(fā)生泄漏芜壁。R本人自食惡果不足惜礁凡,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一高氮、第九天 我趴在偏房一處隱蔽的房頂上張望慧妄。 院中可真熱鬧,春花似錦剪芍、人聲如沸塞淹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饱普。三九已至,卻和暖如春状共,著一層夾襖步出監(jiān)牢的瞬間套耕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工峡继, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留冯袍,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓碾牌,卻偏偏與公主長得像康愤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子舶吗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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