Activity啟動和窗口的創(chuàng)建原理

Window

  • Window是View的直接管理者导坟,所有的視圖都是通過Window這一塊呈現(xiàn)
  • Window是頂級抽象基類,唯一實(shí)現(xiàn)類是PhoneWindow圈澈,作為頂級View會添加到Window Manager中
  • 每一個Activity都包含一個Window實(shí)例惫周,即PhoneWindow,其中Activity的setContentView的方法是調(diào)用PhoneWindow的setContentView方法
  • PhoneWindow中包含成員變量DecorView(FrameLayout)康栈,此頂級View內(nèi)部包含一個豎直方向的LinearLayout递递,上面的標(biāo)題欄(titleBar),下面是內(nèi)容欄啥么。通常我們在Activity中通過setContentView所設(shè)置的布局文件就是被加載到LinearLayout中id為android.R.id.content的內(nèi)容欄里(FrameLayout登舞,即mContentParent)

Activity的xml的加載

  • 初始化:

    Activity.setContentView -->PhoneWindow.setContentView -->PhoneWindow.installDecor() -->創(chuàng)建DecorView對象和mContentParent對象 -->注意mContentParent是DecorView加載的xml里面的一個fragment

  • 填充Layout:

    如果設(shè)置了FEATURE_CONTENT_TRANSITIONS,就會創(chuàng)建Scene完成轉(zhuǎn)場動畫悬荣。否則使用布局填充器將布局文件填充至mContentParent菠秒。到此為止,Activity的布局文件已經(jīng)添加到DecorView里面了

Activity的啟動和Window的添加

  • Activity的啟動氯迂,最終會由ActivityThread中的handleLaunchActivity()來完成整個啟動過程践叠,在這個方法中會通過performLaunchActivity()方法創(chuàng)建Activity,performLaunchActivity()內(nèi)部通過類加載器創(chuàng)建Activity的實(shí)例對象嚼蚀,并調(diào)用其attach()方法為其關(guān)聯(lián)運(yùn)行過程中所依賴的一系列上下文環(huán)境變量以及創(chuàng)建與綁定窗口

  • 在Activity的attach()方法里禁灼,系統(tǒng)會創(chuàng)建Activity所屬的Window對象并為其設(shè)置回調(diào)接口,Window對象會綁定WindowManager轿曙,由于Activity實(shí)現(xiàn)了Window的Callback接口弄捕,因此當(dāng)Window接收到外界的狀態(tài)改變時就會回調(diào)Activity的方法

  • 類似于PhoneWindow和Window的關(guān)系,WindowManager是一個接口导帝,具體的實(shí)現(xiàn)是WindowManagerImpl

  • 經(jīng)過了上面幾個過程守谓,Window和DecorView已經(jīng)被創(chuàng)建并初始化完畢,Activity的布局文件也成功添加到了DecorView的mContentParent中您单,但這個時候的DecorView還沒有被WindowManager正式添加到Window中斋荞,

    Window可以成功使用有2個標(biāo)志:

    • View繪制完畢,可以呈現(xiàn)給用戶
    • View可以接收外界信息(觸摸事件等
  • handleLaunchActivity()方法中handleResumeActivity()睹限,首先配置ActivityClientRecord譬猫,之后將DecorView設(shè)置為INVISIBLE讯檐,因?yàn)閂iew并未繪制完成羡疗,當(dāng)前的DecorView只是一個有結(jié)構(gòu)的空殼,然后通過WindowManagerImpl將DecorView正式的添加到窗口上别洪,
    這一步非常非常重要叨恨,因?yàn)樗?個比較重要和常見的過程:Window的添加過程和View的繪制流程。

    wm.addView(decor, l) -->mGlobal.addView(view, params, mContext.getDisplay(), mParentWindow) --> ViewRootImpl.setView(view, wparams, panelParentView)

  • ViewRootImpl的setView()方法中的requestLayout()完成View的繪制流程挖垛,并且通過WindowSession將View和InputChannel添加到WmS中痒钝,從而將View添加到Window上并且接收觸摸事件秉颗。

添加窗口

添加窗口是通過WindowManagerGlobal的addView方法操作的,這里有三個必要參數(shù)送矩。view蚕甥,params,display栋荸。

  • display : 表示要輸出的顯示設(shè)備菇怀。

  • view : 表示要顯示的View,一般是對該view的上下文進(jìn)行操作晌块。(view.getContext())

  • params : 類型為WindowManager.LayoutParams爱沟,即表示該View要展示在窗口上的布局參數(shù)。其中參數(shù):

    1.flags
    該參數(shù)表示W(wǎng)indow的屬性匆背,它有很多選項(xiàng)呼伸,通過這些選項(xiàng)可以控制Window的顯示特性,這里主要介紹幾個比較常用的選項(xiàng)钝尸。

    FLAG_NOT_FOCUSABLE

    FLAG_NOT_TOUCH_MODAL

    FLAG_SHOW_WHEN_LOCKED

    2.type
    Type參數(shù)表示W(wǎng)indow的類型括享,Window有三種類型,分別是應(yīng)用Window珍促、子Window奶浦、系統(tǒng)Window。應(yīng)用類Window對應(yīng)著一個Activity踢星。子Window不能單獨(dú)存在澳叉,它需要附屬在特定的父Window之中,比如常見的PopupWindow就是一個子Window沐悦。有些系統(tǒng)Window是需要聲明權(quán)限才能創(chuàng)建的Window成洗,比如Toast和系統(tǒng)狀態(tài)欄這些都是系統(tǒng)Window。

    在三類Window中藏否,應(yīng)用Window的層級范圍是199瓶殃。子Window的層級范圍是10001999,系統(tǒng)Window的層級范圍是2000~2999副签,這些層級范圍對應(yīng)著WindowManager.LayoutParams的type參數(shù)遥椿。如果想要Window位于所有Window的最頂層,那么采用較大的層級即可淆储。另外有些系統(tǒng)層級的使用是需要聲明權(quán)限的冠场。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市本砰,隨后出現(xiàn)的幾起案子碴裙,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舔株,死亡現(xiàn)場離奇詭異莺琳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)载慈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門惭等,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人办铡,你說我怎么就攤上這事咕缎。” “怎么了料扰?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵凭豪,是天一觀的道長。 經(jīng)常有香客問我晒杈,道長嫂伞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任拯钻,我火速辦了婚禮帖努,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘粪般。我一直安慰自己拼余,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布亩歹。 她就那樣靜靜地躺著匙监,像睡著了一般。 火紅的嫁衣襯著肌膚如雪小作。 梳的紋絲不亂的頭發(fā)上亭姥,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音顾稀,去河邊找鬼达罗。 笑死,一個胖子當(dāng)著我的面吹牛静秆,可吹牛的內(nèi)容都是我干的粮揉。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼抚笔,長吁一口氣:“原來是場噩夢啊……” “哼扶认!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起塔沃,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤蝠引,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蛀柴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體螃概,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年鸽疾,在試婚紗的時候發(fā)現(xiàn)自己被綠了吊洼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡制肮,死狀恐怖冒窍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情豺鼻,我是刑警寧澤综液,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站儒飒,受9級特大地震影響谬莹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桩了,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一附帽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧井誉,春花似錦蕉扮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至在岂,卻和暖如春荚藻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洁段。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工应狱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人祠丝。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓疾呻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親写半。 傳聞我的和親對象是個殘疾皇子岸蜗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

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