Activity啟動流程與View繪制流程詳解

文字描述如下

1 launcher 通過ServiceManager找到AMS(AMS所在進(jìn)程為SystemServer)通知AMS啟動對應(yīng)Activity

2 AMS收到通知,通知launcher onPause,完畢后AMS準(zhǔn)備啟動Activity

3 Activity查看對應(yīng)activity所在進(jìn)程是否存在,不存在則通知zygote fork 進(jìn)程

4 完畢后利用反射啟動ActivityThread,ActivityThread啟動后會將appThead attch到AMS

5 AMS然后會將appThread與先前fork的進(jìn)程綁定,然后調(diào)用AppThread的bindApplication

6 AppThread會利用Hanlder發(fā)送bindApplicatoin消息

7 然后調(diào)用handleBindApplication,makeApplication 再次利用反射,創(chuàng)建Applicatoin類

8 至此Application啟動完成

9 然后AMS會繼承調(diào)用AppThread通知ActivityThread啟動Activity

10 Activity收到通知,HanldeLanunActivity->performLaunchActivity->activity.attach()

11 然后會創(chuàng)建PhoneWindow,調(diào)用callActivityOnCreate ->setContentView->installDecorView

12 然后到HanldeResumeActivity->WindowManager.addView()->WindowManagerImpl.addView()->WindowManagerImpl.addView()

13 新建ViewRootImpl(view.getContext(), display),然后setView()->performTraversals

14 performTraversal會判斷是否存在Surface,如果沒有則進(jìn)行relayoutWindow->此時會創(chuàng)建Surface用于繪制 -> 走至少一次的performMeasure(至多兩次,第一次為子類希望的大小,如果不合理(父布局判斷)則重新測量,父布局提供具體限制)->再次判斷是否存在Surface,(此時存在)->進(jìn)行onDraw()

private void performTraversals() {
        // 省略無關(guān)代碼
        // Execute enqueued actions on every traversal in case a detached view enqueued an action
        getRunQueue().executeActions(mAttachInfo.mHandler);

          // 省略無關(guān)代碼

            boolean hwInitialized = false;
            boolean contentInsetsChanged = false;
            boolean newSurface = false;
            /**
                hadSurface 第一次進(jìn)入,mSurface.isValid 為false
                因?yàn)檫€沒有創(chuàng)建Surface
                再次進(jìn)入已經(jīng)有Surface了,所以重新為true
            **/
            boolean hadSurface = mSurface.isValid();

                       // 省略無關(guān)代碼

                // 此時創(chuàng)建Surface,利用WindowSession代理對象,WindowManagerService通信,調(diào)用其relayoutWindow函數(shù)
                // 會創(chuàng)建SurfaceContronll然后獲取Surface
                relayoutResult = relayoutWindow(params, viewVisibility, insetsPending);

                // 省略無關(guān)代碼

                if (!hadSurface) {//hadSurface在第一次進(jìn)入時草冈,為false.
                    if (mSurface.isValid()) {//此時Surface已經(jīng)存在,因?yàn)樽哌^了一遍relayoutWindow
                        // If we are creating a new surface, then we need to
                        // completely redraw it.  Also, when we get to the
                        // point of drawing it we will hold off and schedule
                        // a new traversal instead.  This is so we can tell the
                        // window manager about all of the windows being displayed
                        // before actually drawing them, so it can display then
                        // all at once.
                        newSurface = true;//標(biāo)記新建Surface
                        }
                    }
                } 

       
                    // Ask host how big it wants to be
                    performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);

                    if (measureAgain) {
                        performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);
                    }
 
        if (didLayout) {
            performLayout(lp, mWidth, mHeight);
        }

       // 省略無關(guān)代碼

        boolean cancelDraw = mAttachInfo.mTreeObserver.dispatchOnPreDraw() || !isViewVisible;

        if (!cancelDraw && !newSurface) {//第一次進(jìn)來,newSurface為ture,所以走else分支意鲸。
            performDraw();
        } else {
            if (isViewVisible) {
                // Try again
                scheduleTraversals();//重新Travesals
        }
    }

如圖所示


啟動流程詳解

另外是此圖給了我靈感,表示感謝

啟動流程詳解
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子诊胞,更是在濱河造成了極大的恐慌燥筷,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锈锤,死亡現(xiàn)場離奇詭異驯鳖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)久免,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門浅辙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阎姥,你說我怎么就攤上這事记舆。” “怎么了呼巴?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵泽腮,是天一觀的道長御蒲。 經(jīng)常有香客問我,道長诊赊,這世上最難降的妖魔是什么厚满? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮碧磅,結(jié)果婚禮上碘箍,老公的妹妹穿的比我還像新娘。我一直安慰自己鲸郊,他們只是感情好丰榴,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著严望,像睡著了一般多艇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上像吻,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天峻黍,我揣著相機(jī)與錄音,去河邊找鬼拨匆。 笑死姆涩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惭每。 我是一名探鬼主播骨饿,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼台腥!你這毒婦竟也來了宏赘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤黎侈,失蹤者是張志新(化名)和其女友劉穎察署,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體峻汉,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贴汪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了休吠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扳埂。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瘤礁,靈堂內(nèi)的尸體忽然破棺而出阳懂,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布希太,位于F島的核電站克饶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏誊辉。R本人自食惡果不足惜矾湃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望堕澄。 院中可真熱鬧邀跃,春花似錦、人聲如沸蛙紫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坑傅。三九已至僵驰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唁毒,已是汗流浹背蒜茴。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浆西,地道東北人粉私。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像近零,于是被迫代替她去往敵國和親诺核。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

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