Dialog 的顯示過程分析

Tip

這篇文章是由設(shè)計模式中的 Buidler 模式中引出的榛了,由于 AlertDialog 使用了 builder 模式霜大,在分析 Dialog 的過程中革答,用到的 WindowManager 來完成到屏幕的展示,如果想了解 Builder 模式的可以看 這里

正文

在 Dialog 的 show 方法的最后途茫,是通過調(diào)用 WindowManager 的 addView 方法將視圖最后顯示到了屏幕上溪食,接下來就深入了解 addView 方法的工作過程

其實,不單是 Dialog 栅组,Activity 玉掸、Toast 等需要顯示到屏幕上的內(nèi)容醒叁,都是通過 WindowManager 完成的泊业。

WindowManager 在系統(tǒng)注冊時會保存 WindowManagerImpl 對象到 ContextImpl 類中的一個靜態(tài) Map 中的脱吱,使用 Context 的 getSystemService 方法提供單例的對象认罩。

工作過程

第一步 WindowManger 的方法

Dialog 中的 mWindowManager 為 WindowManagerImpl 對象箱蝠,是全局單例的對象宦搬,在 Dialog 的構(gòu)造函數(shù)中初始化 mWindowManager 參數(shù)的值间校,并在 Dialog 的構(gòu)造函數(shù)中創(chuàng)建 Window 對象页慷,Window 對象創(chuàng)建之后,調(diào)用其 setWindowManager 方法建立與 WindowManagerImpl 之間的聯(lián)系

setWindowManager 中主要完成了根據(jù) Window 對象創(chuàng)建新的與 Window 有聯(lián)系的 WindowManagerImpl 實例的任務(wù)酒繁,并為 Window 中的屬性 mWindowManager 賦值,在 Java 層上 Window 與 WindowManager 建立了第一步聯(lián)系揭绑。

mWindowManger = new WindowManagerImpl(mDisplay,window);

由于 Java 中對象傳遞為值傳遞郎哭,所以 Dialog 中將 WindowManagerImpl 傳遞到 Window 對象中進(jìn)行操作,WindowManagerImpl 對象發(fā)生改變邦蜜,Dialog 中的 WindowManagerImpl 對象也會跟著改變的亥至,所以,在 Dialog 的 show 方法中井辆,最終調(diào)用的也是與當(dāng)前 Window 有關(guān)聯(lián)的 WindowManagerImpl 對象的 addView 方法

注意:這里是使用單例的 WindowManagerImpl 溶握,通過不同的 Window 蒸播,構(gòu)建了與 Window 有關(guān)聯(lián)的 WindowManagerImpl 對象

第二步 WindowManagerGlobal 的方法

在 WindowManagerImpl 中存在一個單例存在的 WindowManagerGlobal 對象萍肆,在 WindowManagerImpl 的各個方法中塘揣,將任務(wù)的執(zhí)行過程傳遞到了 WindowManagerGlobal 中宿崭,在傳遞過程中除了將 View、LayoutParams 傳遞奖蔓,還將 WindowManagerImpl 中關(guān)聯(lián)的 window 對象也一起傳遞

在 WindowManagerGlobal 的 addView 方法中讹堤,最后通過 ViewRootImpl 的 setView 將 View 顯示,具體過程是與 WindowManagerService 的交互

ViewRootImpl

繼承自 Handler 類疑务,是作為 native 層和 Java 層 View 系統(tǒng)通信的橋梁

ViewRootImpl 中保存了當(dāng)前線程梗醇,開發(fā)過程中在子線程中更新 UI 會拋出異常,是因為 ViewRootImpl 是 UI 線程中創(chuàng)建的廊镜,并不是因為只有 UI 線程才可以更新 UI

第三步 建立與 WindowManagerService 的聯(lián)系

在 ViewRootImpl 的構(gòu)造方法中唉俗,會調(diào)用 WindowManagerGlobal 的 getWindowSession 方法獲取 IManagerSession 對象

首先 getWindowManagerService 方法中,通過 ServiceManager.getService("window") 方法獲得 IBinder 對象雹姊,Android Framework 與 WMS 的通信通過 Binder 機(jī)制衡楞,再通過 IManagerManager 對象的 Stub 類的 asInterface 函數(shù)將 IBinder 轉(zhuǎn)換成 IWindowManager 對象,再通過 IManagerManager 的 openSession 方法來與 WMS 建立一個長期的通信會話歧杏,需求都通過 Session 來交換信息

簡述總結(jié)一下這個過程犬绒,通過 Binder 機(jī)制獲取 IManagerSession 對象兑凿,再通過 IManagerSession 對象來跟 WMS 完成信息的交換

第四步 ViewRootImpl 的 setView 方法

在 WindowManagerGlobal 的 addView 方法中茵瘾,調(diào)用 ViewRootImpl 的 setView 方法

  1. requestLayout View 樹的 measure layout draw 過程

  2. sWindowSession.add() 方法咐鹤,向 WMS 發(fā)起顯示當(dāng)前 Window 的請求

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雕旨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子奸腺,更是在濱河造成了極大的恐慌血久,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讹蘑,死亡現(xiàn)場離奇詭異筑舅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)版仔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門误墓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人然想,你說我怎么就攤上這事变泄∧涨恚” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵蛙卤,是天一觀的道長表窘。 經(jīng)常有香客問我甜滨,道長,這世上最難降的妖魔是什么衣摩? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任艾扮,我火速辦了婚禮泡嘴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘酌予。我一直安慰自己,他們只是感情好松靡,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布雕欺。 她就那樣靜靜地躺著屠列,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脸哀。 梳的紋絲不亂的頭發(fā)上撞蜂,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天侥袜,我揣著相機(jī)與錄音,去河邊找鬼浦旱。 笑死九杂,一個胖子當(dāng)著我的面吹牛宣蠕,可吹牛的內(nèi)容都是我干的甥捺。 我是一名探鬼主播镰禾,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼屋休!你這毒婦竟也來了劫樟?” 一聲冷哼從身側(cè)響起织堂,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤虑绵,失蹤者是張志新(化名)和其女友劉穎闽烙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體黑竞,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扎酷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年遏匆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凡纳。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡帝蒿,死狀恐怖荐糜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤暴氏,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布延塑,位于F島的核電站,受9級特大地震影響答渔,放射性物質(zhì)發(fā)生泄漏关带。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一研儒、第九天 我趴在偏房一處隱蔽的房頂上張望豫缨。 院中可真熱鬧独令,春花似錦端朵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至敬拓,卻和暖如春乘凸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背葛作。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虱岂,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓绍傲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親荠耽。 傳聞我的和親對象是個殘疾皇子铝量,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350

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