外观
一个窗口添加到系统时 addWindow 和 relayoutWindow 分别做什么?
标准回答
应用 WindowManager.addView 会建立 ViewRootImpl,并通过 Session 请求 WMS 添加窗口。WMS 检查窗口类型、token、权限和 Display,创建或关联 WindowState,设置输入相关信息。首轮及后续遍历中,应用会向系统请求 relayout,WMS 根据窗口属性和显示配置计算窗口几何、Insets、可见性和 Surface 状态,并把应用需要的结果返回。应用据此更新 View 树并渲染。不同 Android 版本里 Surface 创建和同步事务的细节有变化,我会按目标源码确认,避免把所有工作都归结为 addWindow。
延伸追问
BadTokenException 应先查 token 是否有效、Activity 是否已经结束、窗口类型是否正确和调用上下文是否匹配。
内容来源
- Android Framework 知识手册 · 原条目
2-2