android源碼分析之setcontentview如何將UI文件加載

在activity的oncreate方法中,都要setcontentview去設(shè)置一個(gè)布局文件,那我們由這里為起點(diǎn)開始研究之旅

進(jìn)入到Activity如圖1,找尋getWindow發(fā)現(xiàn),window為一個(gè)抽象類,其唯一實(shí)現(xiàn)為PhoneWindow類如圖2


1


2

一、關(guān)注圈出來的兩個(gè)方法,如圖3,第一個(gè)方法是系統(tǒng)的各種布局;第二個(gè)是自己寫的方法布局,其中自己的寫的xml經(jīng)過解析,放入了LayoutParams

3

圖4的第一個(gè)方法為一些初始化,重點(diǎn)關(guān)注第二個(gè)方法,

4

generatelayout方法中是一系列requestFeature方法,如圖5

5


6

真正加載layout中布局的代碼如圖7

7

二、將布局繪制到頁面

在ActivityThread的handleMessage方法中,找到relauch的,進(jìn)一步獲得圖8


8

通過ClientTransactionHandler?中的scheduleTransaction(ClientTransaction transaction)這個(gè)方法,發(fā)送消息,ActivityThread的handleMessage()中處理消息,mTransactionExecutor.execute(transaction)






如下圖發(fā)現(xiàn)?addView方法是接口ViewManager中的方法,肯定會有一個(gè)地方去實(shí)現(xiàn)他,就在ActivityThread中


ViewManager是個(gè)接口,我們要找getWindowManager()方法進(jìn)去繼續(xù)查找實(shí)現(xiàn)

WindowManager也是個(gè)接口,繼續(xù)查找


WindowManageImpl中的addView方法


接近真相的時(shí)刻快到了,下圖箭頭標(biāo)識方法,很可能就是我們想要的方法


如下圖是三個(gè)容器,裝view、root、wparams





measure之后,進(jìn)行布局的擺放,如下圖


資源里所有的view依次全部輪循出來,然后每個(gè)去requestLayout


performLayout之后才進(jìn)行performDraw


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容