在activity的oncreate方法中,都要setcontentview去設(shè)置一個(gè)布局文件,那我們由這里為起點(diǎn)開始研究之旅
進(jìn)入到Activity如圖1,找尋getWindow發(fā)現(xiàn),window為一個(gè)抽象類,其唯一實(shí)現(xiàn)為PhoneWindow類如圖2


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

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

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


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

二、將布局繪制到頁面
在ActivityThread的handleMessage方法中,找到relauch的,進(jìn)一步獲得圖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

