Android WMS概览

server/2024/11/19 22:01:45/

WMS(WindowManagerService)是 Android 系统的核心服务,负责管理应用和系统的窗口,包括窗口的创建、销毁、布局、层级管理、输入事件分发以及动画显示等。它通过协调 InputManager 和 SurfaceFlinger 实现触摸事件处理和窗口渲染,是连接应用界面和底层显示硬件的关键桥梁。

在这里插入图片描述

目录

  1. WindowManagerService 简介
  2. WMS 的架构设计
  3. WMS 的启动过程
  4. 窗口的管理和层级关系
  5. 窗口的创建流程
  6. 输入事件的分发
  7. 动画和屏幕刷新
  8. 关键源码解析
  9. 总结

1. WindowManagerService 简介

WindowManagerService (简称 WMS) 是 Android Framework 中负责管理窗口的核心服务。其主要功能包括:

  • 窗口的创建与销毁: 管理应用程序的窗口生命周期。
  • 窗口的层级管理: 根据 Z-order 和类型对窗口进行排列。
  • 输入事件的分发: 协同 InputManagerService 分发触摸和键盘事件。
  • 动画与过渡: 处理窗口的进入、退出动画。
  • 屏幕显示与布局: 控制屏幕分辨率、方向、屏幕分割等。
  • 多窗口支持: 在新版 Android 中支持多窗口模式。
    WMS 的实现位于 frameworks/base/services/core/java/com/android/server/wm 目录下,是系统中最复杂的服务之一。

在这里插入图片描述

2. WMS 的架构设计

WMS 的架构分为以下几个核心模块:

2.1 核心类

  • WindowManagerServiceWMS 的主类,负责窗口的创建、删除、层级管理和其他服务交互。
  • WindowState表示一个窗口的状态,每个窗口都对应一个 WindowState 对象。
  • WindowToken 和 AppWindowToken用于管理窗口的生命周期,一个 WindowToken 通常表示一个窗口集合(如应用的主窗口和其子窗口)。
  • DisplayContent管理物理屏幕上所有的窗口和布局信息。
  • Session每个应用都有一个对应的 Session,用于进程间通信。

2.2 辅助模块

  • InputManagerService协助处理输入事件。
  • SurfaceFlinger与底层硬件交互,负责最终窗口的显示。
  • ActivityManagerService (AMS) 管理窗口与应用的生命周期。

在这里插入图片描述

3. WMS 的启动过程

WMS 的启动由 SystemServer 触发,其流程如下:

  1. 启动 SystemServerSystemServer 初始化系统服务,包括 WMS。
  2. 调用 startOtherServicesSystemServer.javastartOtherServices() 方法中启动 WMS:
wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore, new UiThread());
  1. 创建 WindowManagerService 实例WindowManagerService.main() 方法中初始化:
public static WindowManagerService main(Context context, InputManagerService inputManager, boolean showBootMsgs, boolean onlyCore, Handler uiHandler) {WindowManagerService service = new WindowManagerService(context, inputManager, showBootMsgs, onlyCore, uiHandler);service.onInitReady();return service;
}
  1. 注册到 ServiceManager将 WMS 注册为系统服务,供其他组件调用。

在这里插入图片描述

4. 窗口的管理和层级关系

WMS 管理窗口的层级,遵循以下原则:

  1. 按照窗口类型分层
  • 应用窗口 (Application Window):如 Activity 的主窗口。
  • 系统窗口 (System Window):如状态栏、导航栏。
  • 子窗口 (Sub Window):附属于主窗口,如对话框。
  1. Z-order 排序窗口的绘制顺序由 Z-order 决定。
  2. 层级结构窗口层级通过 DisplayContentWindowToken 实现树形管理。
    在这里插入图片描述

5. 窗口的创建流程

应用程序请求窗口创建时的流程如下:

  1. 应用调用 WindowManager应用通过 WindowManager.addView() 方法请求添加窗口。
WindowManager wm = getWindowManager();
wm.addView(view, layoutParams);
  1. 通过 Binder 传递到 WMS请求通过 Session 传递到 WMS 的 addWindow() 方法。
  2. 创建 WindowState 对象addWindow() 中为新窗口创建 WindowState 实例。
  3. 绑定 SurfaceWMS 调用 SurfaceFlinger 分配绘制区域,关联 SurfaceControl
  4. 完成添加窗口加入 DisplayContent 的管理树,完成绘制和显示。

6. 输入事件的分发

WMS 协同 InputManagerService 完成输入事件的分发。流程如下:

  1. 输入事件捕获输入事件由 InputManager 捕获后传递给 WMS。
  2. 窗口的焦点判断WMS 根据焦点窗口确定事件目标。
  3. 分发事件通过 IPC 将事件发送到目标窗口所在的应用。
    输入事件分发的核心方法是 deliverPointerEvent()

7. 动画和屏幕刷新

WMS 的动画处理包括窗口的打开、关闭、过渡动画,主要由 WindowAnimator 处理。

屏幕刷新由 Choreographer 协调,确保动画流畅显示。

8. 关键源码解析

8.1 addWindow 源码解析

WindowManagerService.addWindow 是窗口创建的核心方法:

public int addWindow(Session session, IWindow client, int seq, WindowManager.LayoutParams attrs, int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets, DisplayCutout.ParcelableWrapper outDisplayCutout, InputChannel outInputChannel) {synchronized(mGlobalLock) {WindowState win = new WindowState(this, session, client, attrs, seq, viewVisibility);// 校验窗口合法性// 创建 Surface// 加入到 WindowList...}return WindowManagerGlobal.ADD_OKAY;
}

8.2 输入事件分发

在 WMS 中,输入事件分发的核心方法是 processPointerEvent()

public void processPointerEvent(MotionEvent event) {synchronized(mGlobalLock) {WindowState focusedWindow = mFocusedWindow;if (focusedWindow != null) {focusedWindow.deliverInputEvent(event);}}
}

9. 总结

WindowManagerService 是 Android 系统中最重要的服务之一。它不仅连接了应用、系统和硬件,还实现了复杂的窗口管理、动画效果、输入分发等功能。通过深入理解 WMS 的架构和源码,可以帮助开发者更好地优化应用的性能和用户体验。


http://www.ppmy.cn/server/143307.html

相关文章

单片机_day4_串口通信

目录 1. 通信是什么 2. 电平信号和差分信号 3. 通信的分类 3.1 时钟信号划分 3.1.1 同步通信 3.1.2 异步通信 3.2 通信方式划分 3.2 通信方向划分 4. USART和UART(串口通信) 4.1 串口通信协议 4.2.1 TTL 4.2.3 RS485 4.3 三种电平协议下串口…

蓝桥杯第22场小白入门赛

刚好牛客周赛和蓝桥杯周赛时间撞了,于是毅然决然选择了打牛客,结局是本蒟蒻被牛客薄纱/(ㄒoㄒ)/~~ 好吧,然后第二天就来水一水蓝桥杯了(bushi),小白入门赛和前几次一样,6道题只能写5道(什么时候…

RHCE---第六章:DNS域名解析服务器

文章目录 第六章:DNS域名解析服务器产生原因作用:连接方式因特网的域名结构拓扑:分类 域名服务器类型划分 DNS域名解析过程分类:过程分析 搭建DNS域名解析服务器概述安装软件bind服务中三个关键文件主配置文件分析区域配置文件作用…

Vue 3 中使用 `<script setup>` 语法糖实现模板插值表达式

Vue 3 中使用 <script setup> 语法糖实现模板插值表达式 Vue 3 中的 <script setup> 语法糖让我们可以更直接地定义响应式数据和计算属性&#xff0c;从而在模板中使用插值表达式更加简洁。这种写法不需要手动 return 数据和方法&#xff0c;代码更加清晰。本文将…

Hugging_Face下载

能进huggingface的就能翻过去 不行的话可以去参考这个:mojie.app 1.直接原网下载 2.git(小白勿入) 如果是Linux&#xff0c;可以搜一个叫HFD&#xff08;HuggingFace_Download&#xff09; Windows的git安装参考如下&#xff1a;Git安装 建议先看看这个文档&#xff0c; 如果…

智慧社区平台系统提升物业管理效率与居民生活质量

内容概要 智慧社区平台系统是为应对现代城市管理挑战而诞生的重要工具。随着城市化进程的加快&#xff0c;传统的物业管理方式已经难以满足日益增长的居民需求和管理复杂性。因此&#xff0c;引入智能化管理手段显得尤为重要。这个系统不仅仅是一个简单的软件&#xff0c;它是…

新手小白学习docker第七弹------安装redis集群大厂面试

docker目录 0 引言1 面试题1.1 哈希取余分区1.1.1 是什么1.1.2 优点1.1.3 缺点 1.2 一致性哈希算法分区1.2.1 背景1.2.2 目的1.2.3 三大步骤&#xff08;1&#xff09;算法构建一致性哈希环&#xff08;2&#xff09;服务器IP节点映射&#xff08;3&#xff09;key落到服务器的…

Redis与数据库关联小记

Redis 和传统数据库&#xff08;如 MySQL、PostgreSQL 等&#xff09;之间有着密切的关联&#xff0c;但它们在设计理念、用例和功能上有显著的区别。以下是它们之间的一些关键关系和使用场景&#xff1a; 1. 数据存储模型 传统数据库&#xff1a;通常采用关系模型&#xff0…