理清Activity撰茎、View及Window之間關(guān)系

我的CSND博客同步發(fā)布:理清Activity汤求、View及Window之間關(guān)系

轉(zhuǎn)載請注明出處:【huachao1001的簡書:http://www.reibang.com/users/0a7e42698e4b/latest_articles】

View挨稿、Window以及Activity主要是用于顯示并與用戶交互的。這讓我們在初學(xué)的時候很容易弄混鸟妙,而且無法理解他們區(qū)別以及聯(lián)系焦人。本文是筆者查閱相關(guān)資料后挥吵,結(jié)合自己的理解寫出來。希望能幫你梳理清楚他們各自的工作職責(zé)花椭,以及是因?yàn)槭裁葱枨髮?dǎo)致了它們的出現(xiàn)忽匈。

1 View

從我之前寫的【從Android代碼中來記憶23種設(shè)計模式 】這篇文章可知,View(包括ViewGroup)使用的是組合模式矿辽,即:

View組成成樹形結(jié)構(gòu)丹允,以表示“部分-整體”的層次結(jié)構(gòu),使得用戶對單個對象和組合對象的使用具有一致性袋倔。

我們知道雕蔽,View主要是用于繪制我們想要的結(jié)果,是一個最基本的UI組件奕污。

2 Window

2.1 Window的基本理解

簡單地說萎羔,Window表示一個窗口,一般來說碳默,Window大小取值為屏幕大小。但是這不是絕對的缘眶,如對話框嘱根、Toast等就不是整個屏幕大小。你可以指定Window的大小巷懈。Window包含一個View tree和窗口的layout參數(shù)该抒。

感覺Window的理解比較抽象,我個人的理解是顶燕,Window相當(dāng)于一個容器凑保,里面“盛放”著很多View,這些View是以樹狀結(jié)構(gòu)組織起來的涌攻。

如果你還是無法理解的話欧引,你就把Window當(dāng)成是顯示器,顯示器有大有锌一选(對應(yīng)Window有大有兄ゴ恕),View是顯示器里面具體顯示的內(nèi)容因痛。

2.2 Window對象有存在的必要嗎婚苹?

我個人長期有個困惑:Window能做的事情,View對象基本都能做:像什么觸摸事件啊鸵膏、顯示的坐標(biāo)及大小啊膊升、管理各個子View啊等等。View已經(jīng)這么強(qiáng)大了谭企,為什么還多此一舉廓译,加個Window對象评肆。可能有人會說因?yàn)?code>WindowManager管理的就是Window對象呀责循,那我想問糟港,既然這樣,Android系統(tǒng)直接讓WindowManager去管理View不就好了院仿?讓View接替Window的工作秸抚,把Window所做的事情都封裝到View里面不好嘛?(至少免去了我們?nèi)ダ斫獬橄蟮?code>Window歹垫,剥汤,,排惨,O__O "…)吭敢。或許又有人說暮芭,View負(fù)責(zé)繪制顯示內(nèi)容鹿驼,Window負(fù)責(zé)管理View,各自的工作職責(zé)不同辕宏⌒笪可是我想說,Window所做的大部分工作瑞筐,View里面都有同樣(或類似)的處理凄鼻。這依然無法說服我!

關(guān)于Window存在的必要聚假,我查了國內(nèi)外各種資料块蚌,最后有了我個人的理解(如果有錯也歡迎評論糾正~)。在后面小節(jié)里面膘格,我會結(jié)合我個人的理解來解釋峭范。在解釋之前,我們需要了解Window繪制過程闯袒。

2.3 Window繪制過程

在理解Window繪制過程之前虎敦,首先,我們需要知道Surface政敢,在Window中持有一個Surface其徙,那么什么是Surface呢?

Surface其實(shí)就是一個持有像素點(diǎn)矩陣的對象喷户,這個像素點(diǎn)矩陣是組成顯示在屏幕的圖像的一部分唾那。我們看到顯示的每個Window(包括對話框、全屏的Activity、狀態(tài)欄等)都有他自己繪制的Surface闹获。而最終的顯示可能存在Window之間遮擋的問題期犬,此時就是通過Surface Flinger對象渲染最終的顯示,使他們以正確的Z-order顯示出來避诽。一般Surface擁有一個或多個緩存(一般2個)龟虎,通過雙緩存來刷新,這樣就可以一邊繪制一邊加新緩存沙庐。

WindowManager為每個Window創(chuàng)建Surface對象鲤妥,然后應(yīng)用就可以通過這個Surface來繪制任何它想要繪制的東西。而對于WindowManager來說拱雏,這只不過是一塊矩形區(qū)域而已棉安。

前面我們說過,ViewWindow里面用于交互的UI元素铸抑。Windowattach一個View Tree贡耽,當(dāng)Window需要重繪(如,當(dāng)View調(diào)用invalidate)時鹊汛,最終轉(zhuǎn)為WindowSurface蒲赂,Surface被鎖住(locked)并返回Canvas對象刁憋,此時View拿到Canvas對象來繪制自己凳宙。當(dāng)所有View繪制完成后,Surface解鎖(unlock)职祷,并且post到繪制緩存用于繪制,通過Surface Flinger來組織各個Window届囚,顯示最終的整個屏幕有梆。

2.4 關(guān)于Window對象存在的必要

以下是我個人理解!

現(xiàn)在我們知道了Window繪制過程意系,其實(shí)泥耀,站在系統(tǒng)的角度來考慮,一個Window對象代表一塊顯示區(qū)域蛔添,系統(tǒng)不關(guān)心Window里面具體的繪制內(nèi)容痰催,也不管你Window怎么去繪制,反正只給你提供可以在這塊區(qū)域上繪制圖形的Surface對象迎瞧,你Window對象怎么畫是你的事情夸溶!

換句話說,站在系統(tǒng)的角度上看凶硅,系統(tǒng)是“不知道”有View對象這個說法的缝裁!作為系統(tǒng),我有自己的驕傲足绅,不去管你Window如何搬磚捷绑、如何砌墻韩脑,只給你地皮。而這時粹污,Window為了繪制出用戶想要的組件(按鈕段多、文字、輸入框等等)壮吩,系統(tǒng)又不給我进苍!沒事,那我自己定義粥航,于是就定義了View機(jī)制琅捏,給每個View提供Canvas,讓不同的View自己繪制具有自己特色的組件递雀。同時柄延,為了更好的管理View,通過定義ViewGroup缀程,等等搜吧。

相信看到這,你就知道為什么需要Window了杨凑,當(dāng)然了滤奈,本文并不是去糾纏要不要Window對象這個問題。而是通過這個問題撩满,讓我們理清ViewWindow的區(qū)別蜒程。這才是重點(diǎn)!到這里伺帘,如果理由說服不了你昭躺,那你就不要去糾纏了。至少伪嫁,你已經(jīng)理清了ViewWindow之間的關(guān)系了领炫,這就夠了!

3 Activity

3.1 Activity基本理解

對于開發(fā)人員來說张咳,一個Activity就“相當(dāng)于”一個界面(通過setContentView指定具體的View)帝洪。我們可以直接在Activity里處理事件,如onKeyEvent,onTouchEvent等脚猾。 并可以通過Activity維護(hù)應(yīng)用程序的生命周期葱峡。

3.2 Activity有存在的必要嗎?

同樣婚陪,我們還是以是否存在這個問題為切入點(diǎn)族沃,去理清ActivityWindow關(guān)系。

前面我們知道,Window已經(jīng)是系統(tǒng)管理的窗口界面脆淹。那么為什么還需要Activity呢常空?我們把Activity所做的事情,全部封裝到Window不就好了盖溺?

其實(shí)漓糙,本質(zhì)上講,我們要顯示一個窗口出來烘嘱,的確可以不需要Activity昆禽。懸浮窗口中不就是沒有使用Activity來顯示一個懸浮窗嗎?既然如此蝇庭,Window(以及View)能處理點(diǎn)擊事件以及封裝各種邏輯醉鳖,那為啥還需要Activity呢?

個人理解:

Android中的應(yīng)用中哮内,里面對各個窗口的管理相當(dāng)復(fù)雜(任務(wù)棧盗棵、狀態(tài)等等),Android系統(tǒng)當(dāng)然可以不用Activity北发,讓用戶自己直接操作Window來開發(fā)自己的應(yīng)用纹因。但是如果讓用戶自己去管理這些Window,先不說工作量琳拨,光讓用戶自己去實(shí)現(xiàn)任務(wù)棧這點(diǎn)瞭恰,有幾個人能寫的出來。為了讓大家能簡單狱庇、快速的開發(fā)應(yīng)用惊畏,Android通過定義Activity,讓Activity幫我們管理好密任,我們只需簡單的去重寫幾個回調(diào)函數(shù)陕截,無需直接與Window對象接觸。各種事件也只需重寫Activity里面的回調(diào)即可批什。無需關(guān)注其他細(xì)節(jié),默認(rèn)都幫我們寫好了社搅,針對需要定制的部分我們重寫(設(shè)計模式為:模板方法模式)驻债。

最后,如果有理解上的錯誤形葬,也歡迎大家糾正合呐。我會針對大家的意見,不斷更新修改笙以。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淌实,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拆祈,老刑警劉巖恨闪,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異放坏,居然都是意外死亡咙咽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門淤年,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钧敞,“玉大人,你說我怎么就攤上這事麸粮「瓤粒” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵弄诲,是天一觀的道長愚战。 經(jīng)常有香客問我,道長威根,這世上最難降的妖魔是什么凤巨? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮洛搀,結(jié)果婚禮上敢茁,老公的妹妹穿的比我還像新娘。我一直安慰自己留美,他們只是感情好彰檬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谎砾,像睡著了一般逢倍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上景图,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天较雕,我揣著相機(jī)與錄音,去河邊找鬼挚币。 笑死亮蒋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的妆毕。 我是一名探鬼主播慎玖,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼笛粘!你這毒婦竟也來了趁怔?” 一聲冷哼從身側(cè)響起湿硝,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎润努,沒想到半個月后关斜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡任连,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年蚤吹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片随抠。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡裁着,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拱她,到底是詐尸還是另有隱情二驰,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布秉沼,位于F島的核電站桶雀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏唬复。R本人自食惡果不足惜矗积,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望敞咧。 院中可真熱鬧棘捣,春花似錦、人聲如沸休建。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽测砂。三九已至茵烈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砌些,已是汗流浹背呜投。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留存璃,地道東北人宙彪。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像有巧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子悲没,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

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