Skip to content
阅读进度

一个窗口添加到系统时 addWindow 和 relayoutWindow 分别做什么? ​

返回 Framework 与系统服务 目录

标准回答 ​

应用 WindowManager.addView 会建立 ViewRootImpl,并通过 Session 请求 WMS 添加窗口。WMS 检查窗口类型、token、权限和 Display,创建或关联 WindowState,设置输入相关信息。首轮及后续遍历中,应用会向系统请求 relayout,WMS 根据窗口属性和显示配置计算窗口几何、Insets、可见性和 Surface 状态,并把应用需要的结果返回。应用据此更新 View 树并渲染。不同 Android 版本里 Surface 创建和同步事务的细节有变化,我会按目标源码确认,避免把所有工作都归结为 addWindow。

延伸追问 ​

BadTokenException 应先查 token 是否有效、Activity 是否已经结束、窗口类型是否正确和调用上下文是否匹配。

内容来源 ​

用完整回答理解机制,用真实证据解释项目。