news 2026/7/7 9:04:18

WMS窗口管理机制解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
WMS窗口管理机制解析

WMS(Window Manager Service)是Android Framework中负责窗口管理的核心系统服务,其核心机制围绕窗口的创建、管理、显示和交互展开。

###一、WMS的核心职责与架构

WMS作为系统服务,运行在system_server进程中,通过Binder IPC与应用进程通信。其主要职责如下表所示:

核心职责具体说明
窗口管理管理所有窗口(Window)的添加、删除、更新、层级(Z-order)和焦点。
Surface管理为每个窗口分配和管理绘图表面(Surface),并与SurfaceFlinger协作进行合成与显示。
输入事件中转接收来自InputManagerService的输入事件(触摸、按键),并根据窗口层级和焦点状态分发给正确的窗口。
窗口动画管理窗口打开、关闭、切换时的动画效果。
布局与测量根据窗口类型、策略和屏幕状态,计算窗口的最终位置和大小。

其整体架构涉及多个关键组件:

  • WindowManager:客户端(应用)使用的接口,通过WindowManagerGlobal与WMS交互。
  • ViewRootImpl:连接View体系与Window的桥梁,是窗口管理的实际执行者。
  • Session:每个应用进程与WMS建立的Binder会话,用于IPC调用。
  • WindowState:WMS内部代表一个窗口的对象,存储其所有状态信息。
  • DisplayContent:管理特定物理或虚拟显示屏上的所有窗口。

二、核心流程与原理

1.窗口添加流程(以Activity添加View为例)

当Activity启动并调用setContentView后,最终会通过WindowManager.addView()添加窗口。其核心流程如下:

// 伪代码流程示意 // 1. 应用进程:通过WindowManager添加View WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); wm.addView(view, params); // params为WindowManager.LayoutParams // 2. WindowManagerGlobal.addView() 内部public void addView(View view, ViewGroup.LayoutParams params, ...) { ViewRootImpl root = new ViewRootImpl(view.getContext(), display); root.setView(view, wparams, panelParentView); // 关键调用 } // 3. ViewRootImpl.setView() 内部 public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) { // ... 请求布局、初始化输入通道等 // 4. 通过IPC调用WMS的addWindow方法 res = mWindowSession.addToDisplay(...); // mWindowSession是App进程与WMS的Binder代理 }
// 5. WMS端:addWindow 方法(system_server进程) public int addWindow(Session session, IWindow client, ...) { // 创建WindowState对象,代表这个窗口 WindowState win = new WindowState(...); // 为窗口创建SurfaceSession,用于后续分配Surface win.attach(); // 将WindowState添加到对应DisplayContent的窗口列表中 mWindowMap.put(client.asBinder(), win); // 执行布局(relayout),确定窗口位置大小,并创建/更新Surface result = createSurfaceControl(...); // 更新窗口层级,安排动画等 return result; }

此流程完成了从应用视图到系统窗口的注册,并为绘图准备了Surface。

2. Surface的分配与绘图WMS并不直接绘制,而是管理SurfaceSurface是一块图形缓冲区,View的内容通过Canvas绘制到其上。

  1. 分配:在relayoutWindowperformSurfacePlacement时,WMS通过SurfaceControl向SurfaceFlinger申请或更新Surface
  2. 绘图:应用进程通过Surface.lockCanvas()获取Canvas,执行View树的draw方法,然后unlockCanvasAndPost()将绘制内容提交到缓冲区。
  3. 合成:SurfaceFlinger收集所有窗口的Surface缓冲区,根据WMS提供的Z-order等信息进行混合,最终输出到显示屏。

3. 输入事件分发流程

// 伪代码流程示意 // 1. InputReader读取硬件事件 -> InputDispatcher进行分发 // 2. InputDispatcher通过Socket将事件发送到system_server的InputChannel // 3. WMS的InputMonitor负责找到目标窗口 WindowState targetWin = findFocusedWindowTargetLocked(...); // 4. 通过已建立的InputChannel,将事件发送到应用进程的ViewRootImpl // 5. ViewRootImpl的ViewPostImeInputStage处理事件,并传递给DecorView,开始View树的事件传递

WMS根据触摸坐标、窗口可见区域、焦点状态,精确计算事件应派发到哪个WindowState

4. 窗口层级(Z-order)与焦点管理

WMS使用多种令牌(Token)来组织窗口:

  • WindowToken: 将属于同一应用或同一类型的窗口分组(如所有Activity窗口)。
  • AppWindowToken: 继承自WindowToken,专门用于管理Activity的窗口栈。

窗口的Z-order由多个因素决定,主要包括:

  1. 窗口类型: 系统定义的类型(如TYPE_APPLICATIONTYPE_SYSTEM_ALERT),类型值越大,通常层级越高。
  2. 子窗口: 附加在父窗口上,层级随父窗口。
  3. 窗口在栈中的顺序: 对于同类型的窗口(如多个Activity),后显示的通常在先显示的之上。

焦点窗口是当前接收输入事件的窗口。WMS通过setFocusedWindow来更新焦点,并通知InputDispatcher。

三、关键数据结构与类

| 类名 | 所在进程 | 作用 |

| :--- | :--- | :--- |
|WindowManager.LayoutParams| 应用进程 | 描述窗口的属性,如类型、尺寸、软键盘模式等。 |
|ViewRootImpl| 应用进程 | 连接View和WMS的核心类,负责请求布局、接收输入、管理Surface等。 |
|Session| 两端均有 | Binder IPC的会话对象,应用端为代理,WMS端为实体。 |
|WindowState| WMS(system_server) | WMS内部描述一个窗口状态的核心对象,包含其所有信息。 |
|DisplayContent| WMS(system_server) | 管理一个逻辑显示屏上的所有窗口、窗口令牌和屏幕信息。 |
|WindowToken| WMS(system_server) | 窗口令牌,用于将一组窗口绑定在一起管理。 |
|SurfaceControl| 两端均有 | 用于与SurfaceFlinger通信,创建和控制Surface。 |

WMS机制是Android图形显示和用户交互的基石,它通过精细的窗口状态管理和跨进程协作,确保了多窗口环境下的有序显示与流畅交互。


参考来源

  • Android Framework底层原理——WMS机制_android wms 机制流程
  • Android Framework底层原理——WMS机制_android wms 机制流程
  • Android Framework底层原理——WMS机制
  • 最全Android Framework底层原理——WMS机制_android wms 机制流程,2024年最新高级程序员面试题
  • 杂谈-Android源码(AMS、PMS、WMS)及部分原理机制
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 9:01:10

音频编辑的三大痛点与Audacity的免费解决方案

音频编辑的三大痛点与Audacity的免费解决方案 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 你是否曾为音频编辑软件的高昂费用而却步?是否在复杂的专业工具面前感到无从下手?或者担心音频…

作者头像 李华
网站建设 2026/7/7 9:00:36

2026最新:AI视频总结工具怎么选?3款实用神器,亲测免费好用

先说明白核心判断 针对2026年用户选AI视频总结工具的需求,本次亲测了飞书文档、听脑AI、Notion AI三款热门免费可用工具,三款各有明确适配场景:飞书文档适合飞书生态内的企业团队协作,Notion AI适合Notion笔记体系内的个人知识整…

作者头像 李华
网站建设 2026/7/7 9:00:17

从流量曝光到精准获客,豆顶顶 AI+GEO 整合运营方法论

天不说虚的,聊点扎心的。我有一个做少儿编程培训的朋友老吴,前阵子跟我吐槽。他说:“我每个月花两万多投信息流、做内容,表单留资量看着还行,但真正能转化成试听课的,一只手数得过来。” 我问他&#xff1a…

作者头像 李华
网站建设 2026/7/7 8:53:05

KMS_VL_ALL_AIO:企业级智能激活解决方案的技术深度解析

KMS_VL_ALL_AIO:企业级智能激活解决方案的技术深度解析 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 在Windows和Office激活领域,技术爱好者经常面临激活失效、安全风险…

作者头像 李华
网站建设 2026/7/7 8:46:41

企业拓客难?沃创云大模型AI外呼,8大优势实现降本增效

电销行业人力成本高、接通率低、人工效率参差不齐,是多数企业拓客的痛点。沃创云依托大模型打造AI外呼系统,打造更自然、智能、高效的客户触达方案,一站式解决企业外呼难题。八大核心优势,重塑外呼模式 1. 真人级自然对话&#xf…

作者头像 李华
网站建设 2026/7/7 8:44:15

降重降AI的工具怎么选?多款工具实测对比与推荐

论文提交前,AIGC检测率还是居高不下,很多用AI辅助写作的同学都挺焦虑。市面上的降重降AI工具一堆,到底哪个好用?我们用通用大模型和专用工具做了实测,结论很明确——关键要选一款真正针对AIGC检测算法优化过的工具。 …

作者头像 李华