window層級(jí)結(jié)果樹


系統(tǒng)啟動(dòng)的時(shí)候在systemserver中去創(chuàng)建wms,wms中回去創(chuàng)建所有屏幕管理容器RootWindowContainer,在rwc中回去創(chuàng)建對(duì)應(yīng)的DisplayContent,

DisplayContent代表了一個(gè)屏幕的虛擬管理類,每個(gè)Dc都會(huì)創(chuàng)建對(duì)應(yīng)的DisplayPloicy對(duì)象,DP首先會(huì)去初始化Window的層級(jí)結(jié)構(gòu)樹,window總共

分為0~36層,每一層都會(huì)掛載到對(duì)應(yīng)的層級(jí)結(jié)構(gòu)樹上,比如0層就是壁紙window,1層是TaskDisplayArea主要掛載activity的窗口,一次往上會(huì)有

navigationbar和statusbar的掛載層,一次Window就形成了一個(gè)Z-Order順序;

ViewRootImpl WMS

1.

setView();

Session.addTODisplayAsUser() --> addWindow();

1.校驗(yàn)type類型以及是否具有權(quán)限;

2.為窗口創(chuàng)建對(duì)應(yīng)的WindowToken,并把Token根據(jù)type類型把token添加到窗口層級(jí)樹上

activity的窗口被掛到TaskDisplayArea容器中;

3.創(chuàng)建WindowState,并把WindowState添加進(jìn)Token中去;

4.通過對(duì)應(yīng)的DisplayPloicy.addWindow() 過濾window類型是statusbar/navigationbar 等創(chuàng)建

對(duì)應(yīng)的Insets插圖,為后續(xù)activty顯示區(qū)域做計(jì)算使用;

5.更新焦點(diǎn)window;

2.

relayout();

Session.relayout(); --> relayoutWindow();

1.WindowSurfacePlacer.performSurfacePlacer();會(huì)去RWC中遍歷所有dc

2.dc中遍歷所有window,以樹形結(jié)構(gòu)從上到下遍歷;

3.到dp中通過WindowLayout來計(jì)算所有的插圖insets資源的尺寸確定添加window的顯示區(qū)域;

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

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

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