? ? 一個(gè)Activity在啟動(dòng)的時(shí)候,都會(huì)在onCreat()方法中執(zhí)行setContentView(R.layout.activity_main)這行代碼,來(lái)將指定的資源xml文件加載到對(duì)應(yīng)的activity中,那么它究竟是做了什么操作呢?下面就跟大家一起來(lái)看一下源碼。(本文所講是以繼承Activity,為例,并不是AppCompatActivity)
點(diǎn)擊setContentView(R.layout.activity_main)這行代碼,進(jìn)入到Activity類(lèi)里。

我們發(fā)現(xiàn)setContentView實(shí)際上是調(diào)用的Window的setContentView方法

繼續(xù)追蹤,getWindow()返回的mWindow為PhoneWindow對(duì)象

好,我們找到PhoneWindow里面的setContentView()方法,注意里面的installDecor()這個(gè)方法。在這個(gè)方法里new 了一個(gè)DecorView對(duì)象。

注意這行代碼,將傳入的layoutResID加載到mContentParent里面,那么mContentParen又是誰(shuí)呢?

我們追蹤到installDecor()這個(gè)方法里面,發(fā)現(xiàn)是generateLayout(mDecor)這個(gè)方法賦值。繼續(xù)追蹤這個(gè)方法。

注意這個(gè)方法的這里,他將R.layout.screen_simple這個(gè)資源xml加載到了DecorView里面

這就是R.layout.screen_simple這個(gè)資源xml,可以看到是一個(gè)垂直的線(xiàn)性布局,上面的ViewStub就是咱們的appBar,下面的FrameLayout的id為content!,咱們所加載的activity xml頁(yè)面就是加載到這個(gè)布局里面。

看一下mDecor.onResourcesLoaded(mLayoutInflater, layoutResource)這行代碼:

root這個(gè)View所代表的的就是 R.layout.screen_simple,然后DecorView調(diào)用addView將root加載到DecorView里面。最后下圖就是我們Android的activity界面的構(gòu)成,咱們所有的界面都在黃色區(qū)域中,F(xiàn)rameLayout的ID為content。

以上僅為個(gè)人整理的筆記,如有錯(cuò)誤或者疑問(wèn)請(qǐng)大家隨時(shí)指出。