【Android面试】窗口机制专题

发布时间:2026/5/21 9:05:45

【Android面试】窗口机制专题 文章目录一、基础概念与体系架构1. 简述 Window、WindowManager、WMS 三者关系与职责2. Android 中有哪些 Window 类型应用与系统窗口区别 *3. addView/updateViewLayout/removeView 流程4. 为什么 DecorView 是 Window 根 View与 Window 如何绑定5. PhoneWindow 作用二、WindowManager 与 View 关联核心1. 同一个 WM 可添加多个 View不同 WM 实例区别2. addView 中 LayoutInflater 与 WM 流程3. ViewRootImpl 核心作用 与 WMS 通信方式4. 子线程不能更新 UI 原因 与 ViewRootImpl 关系5. LayoutParams 哪些参数影响窗口展示三、WMS 核心原理大厂深度必问1. WMS 如何管理窗口Z-Order 如何计算2. App 与 WMS 通信方式 Binder 作用3. WindowToken 作用为什么 Activity/Dialog 要不同 Token4. AppToken 与 WindowToken 区别5. WMS 感知窗口生命周期Activity 与窗口生命周期对应关系6. 如何判断窗口可获取焦点焦点切换逻辑四、Activity/Dialog/Toast 窗口原理1. Activity 窗口在哪个生命周期创建 添加2. Dialog 与 Activity 窗口区别非 Activity 上下文报错原因3. Toast 窗口类型 限制 崩溃原因4. 悬浮窗权限校验逻辑5. Dialog 依赖 Activity Window脱离 Activity 展示要解决什么五、Surface 与窗口渲染1. Window 与 Surface 关系 窗口渲染流程2. SurfaceFlinger 作用 与 WMS、App 协作3. 硬件加速 开启后渲染变化4. SurfaceView、TextureView 与普通 View 区别5. invalidate/requestLayout 如何到 WMS SF六、Token 机制与权限校验1. 为什么用 WindowToken 校验窗口合法性2. 应用后台弹窗口被拦截核心逻辑3. 不同版本对 Token、后台弹窗的改动4. Application 上下文创建 Dialog 崩溃原因5. 如何绕过 Token 实现后台弹窗系统如何修复七、多窗口、分屏、折叠屏1. 多窗口下 WMS 如何管理应用窗口2. 分屏下窗口尺寸、生命周期、焦点变化3. 折叠屏切换时窗口重建与布局4. 多窗口与 Activity 启动模式关系八、异常场景与问题排查1. WindowLeaked 场景 如何避免2. 后台切回黑屏 / 白屏与窗口机制关系3. 窗口动画卡顿、黑屏分析角度4. 软键盘弹出挤压布局原理九、大厂开放性问题1. 窗口从创建到显示全流程2. 全局悬浮窗实现要点3. 系统窗口与应用窗口通信4. 优化 Activity 窗口启动速度一、基础概念与体系架构1. 简述 Window、WindowManager、WMS 三者关系与职责答案Window抽象类代表一个窗口是 View 的容器。具体实现是 PhoneWindow。WindowManager应用层接口继承自 ViewManager负责 添加、更新、删除窗口是 App 与 WMS 交互的入口。WMSWindowManagerService系统服务运行在 system_server负责所有窗口的管理、层级、尺寸、焦点、动画、显示排序。关系App 通过 WindowManager 跨进程通信Binder请求 WMSWMS 真正决策窗口怎么显示2. Android 中有哪些 Window 类型应用与系统窗口区别 *答案窗口类型分三大类应用窗口TYPE_BASE_APPLICATION、TYPE_APPLICATIONActivity 默认子窗口TYPE_APPLICATION_PANELDialog、PopupWindow必须依附于主窗口系统窗口TYPE_STATUS_BAR、TYPE_TOAST、TYPE_SYSTEM_ALERT 等输入法/悬浮窗/Toast/状态栏区别应用窗口需要 Activity/Token 才能创建受生命周期管理。系统窗口需要额外权限不受单个 Activity 生命周期控制。3. addView/updateViewLayout/removeView 流程App 层 WindowManager → WMS → Surface → SurfaceFlinger → 屏幕渲染addView创建 ViewRootImpl建立与 WMS 的连接向 WMS 注册窗口申请 Surface开始首次 measure/layout/drawupdateViewLayout更新 LayoutParams请求 WMS 重新布局窗口触发 requestLayoutremoveView销毁 Surface向 WMS 注销窗口解除 ViewRoot 与 View 的关联处理窗口泄漏检查4. 为什么 DecorView 是 Window 根 View与 Window 如何绑定答案DecorView 是 Activity/Window 界面的 最顶层 View包含标题栏 内容布局。它是 Window 唯一直接持有的 View。绑定Activity 启动时PhoneWindow 会创建 DecorView并通过 setContentView 将布局添加到 DecorView 的 content 容器中。5. PhoneWindow 作用答案Window 的唯一系统实现类。内部管理 DecorView、标题栏、背景、事件分发、输入法等。是 Activity 和 WindowManager 之间的桥梁。二、WindowManager 与 View 关联核心1. 同一个 WM 可添加多个 View不同 WM 实例区别答案同一个 WindowManager 可以添加多个 View每个 View 对应一个窗口。每个 WindowManager 实例绑定一个 ContextActivity/Application。Activity 的 WM 会携带 Activity TokenApplication 没有所以不能直接弹 Dialog。2. addView 中 LayoutInflater 与 WM 流程答案LayoutInflater 把 xml 解析成 View 树调用 WindowManager.addView(view, params)内部创建 ViewRootImplViewRootImpl 负责与 WMS 通信、创建 Surface、触发绘制3. ViewRootImpl 核心作用 与 WMS 通信方式答案核心作用每个窗口对应一个 ViewRootImpl管理 measure、layout、draw管理 输入事件分发管理 Surface 与渲染管理 与 WMS 的通信ViewRootImpl 是在 DecorView 被添加到 WindowManager 时创建的实际创建时机在 Activity 的 onResume() 之后通信通过 Binder 接口 IWindowSession 与 WMS 通信。4. 子线程不能更新 UI 原因 与 ViewRootImpl 关系答案ViewRootImpl 里有 mThread 检查记录创建时的线程主线程。requestLayout/invalidate 最终会走到 checkThread()。子线程更新会抛出 CalledFromWrongThreadException。本质 UI 操作非线程安全系统用单线程检查强制约束。5. LayoutParams 哪些参数影响窗口展示答案type窗口类型决定层级、权限width/height宽高gravity对齐方式flagsFLAG_NOT_FOCUSABLE、FLAG_NOT_TOUCHABLE 等format像素格式dimAmount背景灰度token窗口令牌权限校验三、WMS 核心原理大厂深度必问1. WMS 如何管理窗口Z-Order 如何计算WMS 运行在 SystemServer通过层级树 WindowState WindowToken管理所有窗口生命周期与布局Z‑Order mBaseLayer mSubLayer由窗口类型决定 base、子窗口在父窗口 base 上叠加 sublayer 越大越靠前。2. App 与 WMS 通信方式 Binder 作用App 与 WMS 全程通过 Binder IPC 通信App 端 WindowManager → IWindowManager/IWindowSession 代理 → WMSWMS通过 IWindow 回调 AppBinder 作用是跨进程通道、远程调用、数据传输、权限校验、事件回调、全局窗口管控。3. WindowToken 作用为什么 Activity/Dialog 要不同 Token答案WindowToken 是窗口的身份令牌用于权限校验。防止恶意应用随意弹系统级窗口。Activity 窗口使用 AppToken/ActivityRecord Token。Dialog 作为子窗口必须使用 宿主 Activity 的 Token。4. AppToken 与 WindowToken 区别- 先有 ActivityToken后有 WindowTokenAMS 创建 Activity → 分配 ActivityToken → 告知 WMS → WMS 依据它创建对应 WindowToken。- 绑定关系WindowToken 内部持有 ActivityToken 引用实现组件层 ↔ 窗口层双向绑定。- 职责划分ActivityToken管页面、生命周期、任务栈AMS 层面WindowToken管窗口、层级、显示、事件WMS 层面为什么必须分开设计职责解耦AMS 只管组件生命周期WMS 只管窗口绘制显示互不侵入。多窗口常见适配一个 Activity 可以开多个窗口一个 ActivityToken 对应多个 WindowState共用一个 WindowToken。系统窗口区分状态栏、Toast、输入法无 Activity直接使用独立 WindowToken不需要 ActivityToken。5. WMS 感知窗口生命周期Activity 与窗口生命周期对应关系Activity 的生命周期由 AMSActivityManagerService 管理窗口生命周期由 WMS 管理二者通过 WindowManager 桥接同步触发但分属不同模块6. 如何判断窗口可获取焦点焦点切换逻辑焦点条件LayoutParams.FLAG_NOT_FOCUSABLE 为true窗口可见不被完全遮挡属于当前前台应用切换触摸 / 按键 → WMS 计算顶层可焦点窗口 → 通知对应窗口获取焦点。同一时间只有一个窗口拥有焦点焦点永远给最顶层的符合条件的窗口子窗口优先于父窗口四、Activity/Dialog/Toast 窗口原理1. Activity 窗口在哪个生命周期创建 添加Activity 窗口在 onCreate 中完成创建并提交添加请求onResume 阶段由 WMS 完成显示与焦点分配。但 addView 真正被系统调用的位置是ActivityThread 的 handleResumeActivity 方法中在 onResume 执行完成之后。2. Dialog 与 Activity 窗口区别非 Activity 上下文报错原因Dialog 是 子窗口必须依附 Activity 窗口。Activity 窗口有 AppTokenDialog 使用宿主 Token。用 Application 等无 Token 的 Context系统校验 Token 失败 → 抛出 WindowManager.BadTokenException。3. Toast 窗口类型 限制 崩溃原因类型TYPE_TOAST系统窗口限制自动超时消失高版本无法自定义 Toast后台弹出受限常见崩溃Toast 持有 Activity 引用导致销毁时窗口泄漏7.1 以下 Toast 内部 TN 类 Binder 泄漏导致崩溃4. 悬浮窗权限校验逻辑系统窗口类型需要SYSTEM_ALERT_WINDOW 权限6.0 前声明即用无需授权6.0 后不能动态申请只能跳设置让用户手动开WMS 会检查类型 权限 Token5. Dialog 依赖 Activity Window脱离 Activity 展示要解决什么Dialog 是子窗口必须绑定 Activity Token。脱离 Activity 需要使用 系统窗口类型申请悬浮窗权限自己管理生命周期防止窗口泄漏五、Surface 与窗口渲染1. Window 与 Surface 关系 窗口渲染流程Surface 是一块 画布缓冲区Window 对应一个 Surface。渲染流程Activity 创建 PhoneWindow、DecorView构建 View 视图树绑定 Activity WindowToken向 WMS 注册窗口属性handleResumeActivity 执行 addView正式请求添加窗口WMS 向 SurfaceFlinger 申请分配 Surface 绘图缓冲区应用侧通过 Choreographer 监听 VSync 垂直同步信号VSync 信号抵达 → Choreographer 统一调度渲染任务触发 View 三大流程测量 → 布局 → 绘制 (由ViewRootImpl执行)绘制完成提交 Surface 帧数据SurfaceFlinger 对所有窗口 Surface 分层排序、图层混合合成交由 HWComposer 硬件合成最终刷新屏幕完成显示2. SurfaceFlinger 作用 与 WMS、App 协作SurfaceFlinger系统合成服务负责 所有图层混合、合成、送显。WMS 告诉 SF 窗口位置、大小、层级。App 往 Surface 里写数据。SF 按 Z 序合成所有窗口输出到屏幕。3. 硬件加速 开启后渲染变化硬件加速使用 GPU 绘制 View。变化绘制性能大幅提升绘制模型变成 显示列表DisplayList部分 API 不兼容或行为改变4. SurfaceView、TextureView 与普通 View 区别普通 View共享同一个 Surface在主线程绘制。SurfaceView独立 Surface可子线程绘制效率高但不支持动画、平移旋转。TextureView有独立缓冲但挂载在应用窗口中支持变换、动画。5. invalidate/requestLayout 如何到 WMS SFrequestLayout()触发 measure layout 重新测量布局不走 drawinvalidate()只触发 draw 重绘不重新测量布局view.requestLayout()→ 上报 ViewRootImpl → 注册 Choreographer 监听 VSync → VSync 到来执行 measure layout → 窗口尺寸/位置变更 → 跨进程通知 WMS 更新窗口属性 → 可选触发draw写入Surface → 提交缓冲区 → SF合成渲染上屏view.invalidate()→ 标记脏区域 → 上报 ViewRootImpl → 等待VSync → 仅执行draw绘制 → 内容写入Surface缓冲区 → 直接提交帧数据给SF合成显示 → 不通知WMS修改窗口布局信息六、Token 机制与权限校验1. 为什么用 WindowToken 校验窗口合法性防止恶意应用在后台随意弹窗、仿冒界面、窃取隐私。Token 由系统分发App 不能伪造。只有合法 Token 才能创建对应级别窗口。不同应用、不同进程窗口拥有不同 WindowTokenWMS 依靠 Token 做进程隔离禁止跨进程随意依附弹窗保障系统界面安全。2. 应用后台弹窗口被拦截核心逻辑高版本 Android 限制后台应用弹出覆盖层窗口。WMS 检查应用是否在前台是否有特殊权限窗口类型是否允许后台显示无权限则拒绝 addView。3. 不同版本对 Token、后台弹窗的改动Android 6.0悬浮窗动态权限Android 8.0Toast 改用 TYPE_TOAST禁止自定义 ToastAndroid 10/11严格限制后台悬浮窗、后台弹出 Activity整体趋势越来越严越安全4. Application 上下文创建 Dialog 崩溃原因Application Context 没有 Activity Token。Dialog 是子窗口必须依附带 Token 的 Activity 窗口。WMS 校验 Token 为空 → 直接抛异常。5. 如何绕过 Token 实现后台弹窗系统如何修复早期利用 系统漏洞 / 反射 伪造 Token。利用 TYPE_SYSTEM_ALERT 等系统窗口。系统修复严格权限严格 Token 校验后台弹出限制高版本无法通用绕过七、多窗口、分屏、折叠屏1. 多窗口下 WMS 如何管理应用窗口WMS 为每个窗口分配 固定区域。每个应用视为独立窗口栈。焦点、输入、尺寸单独管理。生命周期与正常 Activity 略有区别如不总是 onStop。2. 分屏下窗口尺寸、生命周期、焦点变化尺寸按分屏比例重新 layout生命周期不会正常走 onStop保持 resumed焦点同一时间只有一个窗口获焦3. 折叠屏切换时窗口重建与布局折叠屏切换时硬件传感器通知 DisplayManager → AMS 判定配置变更 →WMS 重新计算窗口大小并 relayout→ 应用默认重建 Activity或通过configChanges 动态 resize→ ViewRootImpl 在 VSync 驱动下重新 measure/layout/draw → SurfaceFlinger 合成新屏幕图层并上屏。核心是配置变更触发窗口重建 / 重布局VSyncChoreographer 保障渲染时序同时需适配铰链与大屏布局。4. 多窗口与 Activity 启动模式关系多窗口下standard 等模式会在 对应窗口栈 内创建。分屏时新 Activity 默认在同半屏打开。特殊启动模式如 singleInstance会独占一个窗口。八、异常场景与问题排查1. WindowLeaked 场景 如何避免场景Activity 销毁时Dialog/Toast/ 悬浮窗未关闭窗口仍持有 Activity 引用避免onDestroy 中 dismiss Dialog用 Application 生命周期管理全局弹窗及时 removeView2. 后台切回黑屏 / 白屏与窗口机制关系Activity 被销毁后重新创建DecorView 未完成绘制前显示窗口背景或 Surface 未准备好白屏Activity主题 windowBackground 底色先显示布局还未渲染黑屏Surface 未就绪无画布内容系统默认黑色画布填充3. 窗口动画卡顿、黑屏分析角度动画卡顿动画黑屏**窗口动画卡顿**从主线程阻塞、视图绘制过重、频繁窗口重布局 IPC 耗时、Surface 渲染缓冲不足、SF 合成压力、VSync 时序不同步六大角度分析。动画过程黑屏核心是Surface 销毁重建时序不同步、窗口可见早于视图绘制、WindowToken 失效挂载异常、配置变更重建中断渲染、顶层窗口抢占遮挡导致画面断层缺失。4. 软键盘弹出挤压布局原理输入法是一个系统窗口。键盘弹出 → WMS 调整应用窗口大小windowSoftInputMode 控制压缩布局平移布局不调整九、大厂开放性问题1. 窗口从创建到显示全流程Activity → PhoneWindow → DecorView → ViewRootImpl → WMS → SurfaceFlinger → 屏幕。2. 全局悬浮窗实现要点申请悬浮窗权限使用系统窗口类型处理触摸、拖动、焦点注意生命周期防止泄漏3. 系统窗口与应用窗口通信Binder、AIDL、ContentProvider、广播。4. 优化 Activity 窗口启动速度减少布局层级异步加载优化绘制避免主线程耗时复用窗口 / 预创建 DecorView

相关新闻