Android WMS概览
WMS(WindowManagerService)是 Android 系统的核心服务,负责管理应用和系统的窗口,包括窗口的创建、销毁、布局、层级管理、输入事件分发以及动画显示等。它通过协调 InputManager 和 SurfaceFlinger 实现触摸事件处理和窗口渲染,是连接应用界面和底层显示硬件的关键桥梁。
目录
- WindowManagerService 简介
- WMS 的架构设计
- WMS 的启动过程
- 窗口的管理和层级关系
- 窗口的创建流程
- 输入事件的分发
- 动画和屏幕刷新
- 关键源码解析
- 总结
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
触发,其流程如下:
- 启动 SystemServerSystemServer 初始化系统服务,包括 WMS。
- 调用 startOtherServices在
SystemServer.java
的startOtherServices()
方法中启动 WMS:
wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore, new UiThread());
- 创建 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;
}
- 注册到 ServiceManager将 WMS 注册为系统服务,供其他组件调用。
4. 窗口的管理和层级关系
WMS 管理窗口的层级,遵循以下原则:
- 按照窗口类型分层
- 应用窗口 (Application Window):如 Activity 的主窗口。
- 系统窗口 (System Window):如状态栏、导航栏。
- 子窗口 (Sub Window):附属于主窗口,如对话框。
- Z-order 排序窗口的绘制顺序由 Z-order 决定。
- 层级结构窗口层级通过
DisplayContent
和WindowToken
实现树形管理。
5. 窗口的创建流程
应用程序请求窗口创建时的流程如下:
- 应用调用 WindowManager应用通过
WindowManager.addView()
方法请求添加窗口。
WindowManager wm = getWindowManager();
wm.addView(view, layoutParams);
- 通过 Binder 传递到 WMS请求通过
Session
传递到 WMS 的addWindow()
方法。 - 创建 WindowState 对象在
addWindow()
中为新窗口创建WindowState
实例。 - 绑定 SurfaceWMS 调用
SurfaceFlinger
分配绘制区域,关联SurfaceControl
。 - 完成添加窗口加入
DisplayContent
的管理树,完成绘制和显示。
6. 输入事件的分发
WMS 协同 InputManagerService 完成输入事件的分发。流程如下:
- 输入事件捕获输入事件由 InputManager 捕获后传递给 WMS。
- 窗口的焦点判断WMS 根据焦点窗口确定事件目标。
- 分发事件通过 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 的架构和源码,可以帮助开发者更好地优化应用的性能和用户体验。
相关文章:
Android WMS概览
WMS(WindowManagerService)是 Android 系统的核心服务,负责管理应用和系统的窗口,包括窗口的创建、销毁、布局、层级管理、输入事件分发以及动画显示等。它通过协调 InputManager 和 SurfaceFlinger 实现触摸事件处理和窗口渲染&a…...
新一代API开发工具,让API调试更快 更简单
新一代API开发工具 代理调试 请求测试一站式解决方案 Reqable Fiddler Charles Postman, 让API调试更快 🚀 更简单 👌 直接上下载地址 根据系统,下载对应的版本即可 https://reqable.com/zh-CN/download/...
友元类和友元函数
友元函数的定义: 友元函数是在类定义中被声明为 “朋友” 的非成员函数。它可以访问类的私有成员和保护成员(变量和方法),就好像它是类的成员函数一样。友元函数的声明以friend关键字开头,在类的内部进行声明,但它的定义在类的外部ÿ…...
Sulfo-Cy5-Iodoacetamide能够发出明亮的荧光信号,使得生物样本的精细结构得以清晰呈现
一、基本信息 英文名称:Sulfo-Cy5-Iodoacetamide,Sulfo-Cyanine5-Iodoacetamide,Sulfo Cy5 IA 中文名称:磺酸Cy5碘乙酰胺 分子式:C36H44IKN4O8S2 分子量:890.89 纯度:≥95% 外观ÿ…...
Python中的TCP
文章目录 一. 计算机网络1. 网络的概念2. IP地址① IP地址的概念② IP地址的表现形式③ IP地址的作用④ 网络查询命令Ⅰ. ifconfig/ipconfigⅡ. ping 3. 端口和端口号的概念(计算机通信原理)① 端口的概念② 端口号的概念 4. socket套接字① socket概念② socket使用场景 二. T…...
CSS(8)高级技巧:精灵图,css三角,用户界面,vertical-align属性应用
一.精灵图 通过css中的background-position属性,将多张图合成为一张图 二.css三角 在网页中,我们可以添加css属性获得三角图标 solid:实心,边框的实心 transparent:透明,图中代码表示只有左边粉色,其余地方为透明 三ÿ…...
Flink新版Source接口源码解析
目录 1. 前言 2. Source解析 2.1 Source类图 2.2 接口和方法说明 2.2.1 Source,> 3. SplitEnumerator解析 3.1 SplitEnumetator类图 3.2 类和方法说明 3.2.1 SplitEnumerator 3.2.2 SimpleVersionedSerializer 4. SourceReader解析 4.1 SourceReader类图 4.2 类…...
SLM561A系列60V10-50mA单通道线性恒流LED驱动芯片,为汽车照明、景观照明助力
SLM561A系列选型参考: SLM561A10ae-7G SOD123 SLM561A15ae-7G SOD123 SLM561A20ae-7G SOD123 SLM561A25ae-7G SOD123 SLM561A30ae-7G SOD123 SLM561A35ae-7G SOD123 SLM561A40ae-7G SOD123 SLM561A45ae-7G SOD123 SLM561A50ae-7G SOD123 S…...
一次失败的wxpython安装macOS M1
WARNING: The scripts libdoc, rebot and robot are installed in /Users/用户名/Library/Python/3.8/bin which is not on PATH. 背景:想在macos安装Robot Framework ,显示pip3不是最新,更新pip3后显示不在PATH上 参看博主文章末尾 MAC系统…...
【大数据技术基础 | 实验十一】Hive实验:新建Hive表
文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤(一)启动Hive(二)创建表(三)显示表(四)显示表列(五)更改表(六&am…...
【yarn】yarn rest api每日job数量分析
一、说明 # 无法制定时间范围!!! yarn application -list 官方文档 rest返回内容(官网案例): {app":{"id":"application_1324057493980_0001","user":"user1&q…...
蓝桥杯单片机第十一届省赛(第一场)
主函数代码 #include<iic.h> #include<intrins.h>sfr P40xc0; sbit R3P3^2; sbit R4P3^3; sbit C4P3^4; sbit C3P3^5;unsigned char code led_nodot[]{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char code led_dot[]{0x40,0x79,0x24,0x30,0x…...
hive复杂数据类型Array Map Struct 炸裂函数explode
1、Array的使用 create table tableName( ...... colName array<基本类型> ...... ) 说明:下标从0开始,越界不报错,以null代替 arr1.txtzhangsan 78,89,92,96 lisi 67,75,83,94 王五 23,12 新建表: create table arr1(n…...
FIFO架构专题-FIFO是什么
目录 简介: FIFO参数: 1.宽度WIDTH(一次位数) 2.深度DEEPTH(存多少次) FIFO的分类: 同步FIFO 异步FIFO 读写位宽不同的FIFO FIFO信号介绍 写时钟 写数据 写使能 读时钟 读数据 读…...
Pythony——多线程简单爬虫实现
简单爬虫实现 import requests from bs4 import BeautifulSoup# 生成要爬取的网页地址列表,这里是博客园的分页地址,从第1页到第50页 urls [f"https://www.cnblogs.com/#p{i}" for i in range(1, 50 1)]# 生产者函数——负责下载网页内容 d…...
如何修改 a 链接的样式
在CSS中,你可以使用选择器来针对HTML中的特定元素(例如<a>标签,也就是链接)进行修改样式。以下是一些常见的修改<a>链接样式的方法: 移除下划线: a { text-decoration: none; } 修改链接的…...
第6章 详细设计-6.5 软硬件接口文档设计
6.5 软硬件接口文档设计 一般的产品都包含硬件和软件两部分,产品设计阶段需要确保硬件开发人员和软件开发的沟通准确、高效。所以需要一份书面的文档来承载软件和硬件之间的沟通细节。以下面的细水雾除尘设备为例进行讲解,涉及软件和硬件的接口ÿ…...
【pyspark学习从入门到精通14】MLlib_1
目录 包的概览 加载和转换数据 在前文中,我们学习了如何为建模准备数据。在本文中,我们将实际使用这些知识,使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式,即它不再积极开发…...
C++全局构造和初始化
片段摘自程序员的自我修养—链接、装载与库.pdf 11.4 程序在进入main之前,需要对全局对象进行构造初始化。 glibc全局对象进行构造初始化 gibc启动程序时会经过.init段,退出程序时会经过.finit段。这两个段中的代码最终拼接成_init()和_finit(),这两个…...
安全见闻-泷羽sec课程笔记
编程语言 C语言:一种通用的、面向过程的编程语言,广泛应用于系统软件和嵌入式开发。 C:在C语言基础上发展而来,支持面向对象编程,常用于尊戏开发、高性能计算等领域。 Java:一种广泛使用的面问对象编程语言,具有跨平台…...
游戏引擎学习第17天
视频参考:https://www.bilibili.com/video/BV1LPUpYJEXE/ 回顾上一天的内容 1. 整体目标: 处理键盘输入:将键盘输入的处理逻辑从平台特定的代码中分离出来,放入更独立的函数中以便管理。优化消息循环:确保消息循环能够有效处理 …...
【FFmpeg】FFmpeg 内存结构 ③ ( AVPacket 函数简介 | av_packet_ref 函数 | av_packet_clone 函数 )
文章目录 一、av_packet_ref 函数1、函数原型2、函数源码分析3、函数使用代码示例 二、av_packet_clone 函数1、函数原型2、函数源码分析 FFmpeg 4.0 版本源码地址 : GitHub : https://github.com/FFmpeg/FFmpeg/tree/release/4.0GitCode : https://gitcode.com/gh_mirrors/ff…...
【学习笔记】量化概述
Quantize量化概念与技术细节 题外话,在七八年前,一些关于表征的研究,会去做表征的压缩,比如二进制嵌入这种事情,其实做得很简单,无非是找个阈值,然后将浮点数划归为零一值,现在的Qu…...
同步互斥相关习题10道 附详解
PV操作 2016 某系统允许最多10个进程同时读文件F,当同时读文件F的进程不满10个时,欲读该文件的其他文件可立即读,当已有10个进程在读文件F时读,其他欲读文件F的进程必须等待,直至有进程读完后退出方可去读 在实现管…...
【Python · PyTorch】卷积神经网络 CNN(LeNet-5网络)
【Python PyTorch】卷积神经网络 CNN(LeNet-5网络) 1. LeNet-5网络※ LeNet-5网络结构 2. 读取数据2.1 Torchvision读取数据2.2 MNIST & FashionMNIST 下载解包读取数据 2. Mnist※ 训练 LeNet5 预测分类 3. EMnist※ 训练 LeNet5 预测分类 4. Fash…...
Git 拉取指定分支创建项目
一 背景 因为项目过大,只需要部分分支的代码即可。 二 实现 方法一:使用 --single-branch 参数 git clone 支持只拉取指定分支,而不是整个库的所有分支: git clone --branch <branch_name> --single-branch <reposi…...
CF862B Mahmoud and Ehab and the bipartiteness(二分图的性质)
思路:一个二分图是由两个集合组成的,同一个集合中的节点间不能连边,所以一个二分图最多有cnt[1]*cnt[2]条边,题目给出一个树的n-1条边,要我们添加最多的边数使他成为二分图,添加的边数就是cnt[1]*cnt[2]-n1…...
React Native 全栈开发实战班 :数据管理与状态之React Hooks 基础
在 React Native 应用中,数据管理与状态管理是构建复杂用户界面的关键。React 提供了多种工具和模式来处理数据流和状态管理,包括 React Hooks、Context API 以及第三方状态管理库(如 Redux)。本章节将详细介绍 React Hooks 的基础…...
传奇996_22——自动挂机
登录钩子函数中执行 callscript(actor, "../QuestDiary/主界面基础按钮/主界面基础按钮QM", "基础按钮QM")基础按钮QM执行了已下代码 #IF Equal <$CLIENTFLAG> 1 #ACT goto PC端面板加载#IF Equal <$CLIENTFLAG> 2 #ACT goto 移动端面板加载…...
faiss 提供了多种索引类型
faiss 多种索引类型 在 faiss 中,IndexFlatL2 是一个简单的基于 L2 距离(欧几里得距离)进行索引的索引类型,但实际上,faiss 提供了多种索引类型,支持不同的度量方式和性能优化,您可以根据需求选…...
齐齐哈尔网站建设/seo排名优化价格
Item 38. Exception Safety Axioms公理,公认之理,无需证明。要证明一个欧几里得几何的定理,要借助于一系列的公理。要判断代码是否是异常安全,也有一系列的公理可以借用。------------------------------------------------------…...
建站科技公司/如何做网络推广外包
今天在处理客户反馈的时候,客户发现了一个严重性的问题,发现在el-dialog中嵌套el-form,在el-from中有个邮单编码是用扫码枪录入的,需求明确指出可以录入多条邮单号。但是由于我们开发时没有用扫码枪测试该功能,后来客户发现&#…...
网站设计红色表示什么/湖南株洲疫情最新情况
Description 已知一个按先序输入的字符序列,如abd,eg,cf,(其中,表示空结点)。请建立该二叉树并按从上到下从左到右的顺序输出该二叉树的所有叶子结点。 Input 输入数据有多行,每一行是一个长度小于50个字符的字符串。 Output 按从上到下从左到右的顺序…...
比较好的外贸网站/aso搜索优化
描述 给定一棵二叉树的前序遍历和中序遍历的结果,求其后序遍历。 输入 输入可能有多组,以EOF结束。 每组输入包含两个字符串,分别为树的前序遍历和中序遍历。每个字符串中只包含大写字母且互不重复。 输出 对于每组输入,用一…...
淘宝移动网站建设/巨量数据分析入口
可以发现,只要存在连续k个相同的,这个情况就一定是合法情况 然而这个不太好算,我们算不存在k个相同的,然后用$m^n$把它减掉 设f[i]为前i个,没有连续k个的 显然$f[i]m^i ,i<K$ 然后我们现在想把f[i]转移过来…...
单页面网站可以做自适应网站吗/网络营销的方法有哪些?
一、准备 hive下载地址:mirror.bit.edu.cn/apache/hive… 二、Hadoop环境搭建 Hadoop安装和配置,请看Hadoop单机版安装 三、mysql安装 因为Hive的默认元数据是Mysql,所以先要安装Mysql。 首先查看mysql 是否已经安装 rpm -qa | grep mysql 复…...