8.Window与WindowManager
1.概述
- 所有视图都通过Window来呈现,包括Activity/Dialog/Toast等,Window是View的直接管理者;
- WindowManager是外界访问Window的入口;
- Window的具体实现在WindowManagerService中,WindowManage与WindowManagerService的交互式IPC过程。
2.关键类图
3.重点关注WindowManager的3个方法:addView/updateView/removeView
3.1 添加Window的过程
- 检查参数是否合法,若是子Window还需进一步调整布局参数;
- 创建ViewRootImpl并将View添加到列表中,桥接模式由WindowManagerGlobal来完成;
- 通过ViewRootImpl的setView方法完成更新界面并完成Window的添加过程。
WindowManager.addView -> WindowManagerGloabal.addView -> ViewRootImpl.setView -> WindowManagerService
3.2 删除Window的过程
- 找到待删除View的索引index;
- removeViewLocked方法内部通过ViewRootImpl的die方法完成,并将view加到mDyingViews列表中。
WindowManager.removeView -> WindowManagerGlobal.removeView -> ViewRootImpl.die
3.3 更新Window的过程
- 更新View的LayoutParams并替换老的LayoutParams;
- 更新ViewRootImpl中的LayoutParams.
WindowManager.updateView -> WindowManagerGlobal.updateLayoutView -> ViewRootImpl.setLayoutParams