系统启动的时候在systemserver中去创建wms,wms中回去创建所有屏幕管理容器RootWindowContainer,在rwc中回去创建对应的DisplayContent,
DisplayContent代表了一个屏幕的虚拟管理类,每个Dc都会创建对应的DisplayPloicy对象,DP首先会去初始化Window的层级结构树,window总共
分为0~36层,每一层都会挂载到对应的层级结构树上,比如0层就是壁纸window,1层是TaskDisplayArea主要挂载activity的窗口,一次往上会有
navigationbar和statusbar的挂载层,一次Window就形成了一个Z-Order顺序;
ViewRootImpl WMS
1.
setView();
Session.addTODisplayAsUser() --> addWindow();
1.校验type类型以及是否具有权限;
2.为窗口创建对应的WindowToken,并把Token根据type类型把token添加到窗口层级树上
activity的窗口被挂到TaskDisplayArea容器中;
3.创建WindowState,并把WindowState添加进Token中去;
4.通过对应的DisplayPloicy.addWindow() 过滤window类型是statusbar/navigationbar 等创建
对应的Insets插图,为后续activty显示区域做计算使用;
5.更新焦点window;
2.
relayout();
Session.relayout(); --> relayoutWindow();
1.WindowSurfacePlacer.performSurfacePlacer();会去RWC中遍历所有dc
2.dc中遍历所有window,以树形结构从上到下遍历;
3.到dp中通过WindowLayout来计算所有的插图insets资源的尺寸确定添加window的显示区域;
网友评论