Android Framework解析——WMS原理

作者:bobby_developer

1. WMS原理:WMS角色与实例化过程

  • window:它是一个抽象类,具体实现类为 PhoneWindow ,它对 View 进行管理。Window是View的容器,View是Window的具体表现内容;

  • windowManager:是一个接口类,继承自接口 ViewManager ,从它的名称就知道它是用来管理 Window 的,它的实现类为 WindowManagerImpl;

  • WMS:是窗口的管理者,它负责窗口的启动、添加和删除。另外窗口的大小和层级也是由它进行管理的;

SystemServer启动WMS流程表:

1.1 window

1.2 显示层级

1.3 窗口标志位

1.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON(当Window可见时允许锁屏)
2.FLAG_NOT_FOCUSABLE(Window 不能获得输入焦点,即不接受任何按键或按钮事件,例如该 Window 上 有 EditView,点击 EditView 是 不会弹出软键盘的,Window 范围外的事件依旧为原窗口处理;例如点击该窗口外的view,依然会有响应。另外只要设置了此Flag,都将会启用FLAG_NOT_TOUCH_MODAL) 3.FLAG_NOT_TOUCH_MODAL(设置了该 Flag,将 Window 之外的按键事件发送给后面的 Window 处理, 而自己只会处理 Window 区域内的触摸事件;Window 之外的 view 也是可以响应 touch 事件。 4.FLAG_NOT_TOUCHABLE(设置了该Flag,表示该 Window 将不会接受任何 touch 事件,例如点击该 Window 不会有响应,只会传给下面有聚焦的窗口) 5.FLAG_KEEP_SCREEN_ON(只要 Window 可见时屏幕就会一直亮着,视频播放、游戏) 6.FLAG_LAYOUT_NO_LIMITS(允许 Window 超过屏幕之外)
7.FLAG_IGNORE_CHEEK_PRESSES(当用户的脸贴近屏幕时(比如打电话),不会去响应此事件 )
8.FLAG_SHOW_WHEN_LOCKED(当用户的脸贴近屏幕时(比如打电话),不会去响应此事件
9.FLAG_IGNORE_CHEEK_PRESSES ; 窗口可以在锁屏的 Window 之上显示, 使用Activity#setShowWhenLocked(boolean) 方法代替)

1.4 WindowManager

在了解WindowManager管理View实现之前,先了解下WindowManager相关类图以及Activity界面各层级显示关系;

2. WMS工作原理

2.1 WMS职责

2.2 WMS中重要的一些属性释义

2.3 AddWindow源码分析

WMS中addWindow源码分析,在分析addWindow之前,先了解几个类;

  • WindowToken

    WindowToken具有令牌的作用,是对应用组件的行为进行规范管理的一个手段。WindowToken由应用组件或其管理者负责向WMS声明并持有。应用组件在需要新的窗口时,必须提供WindowToken以表明自己的身份,并且窗口的类型必须与所持有的WindowToken的类型一致,同时它将属于同一个应用组件的窗口组织在了一起;

  • DisplayContent

    如果说WindowToken按照窗口之间的逻辑关系将其分组,那么DisplayContent则根据窗口的显示位置将其分组。隶属于同一个DisplayContent的窗口将会被显示在同一个屏幕中。每一个DisplayContent都对应这一个唯一的ID,在添加窗口时可以通过指定这个ID决定其将被显示在那个屏幕中。DisplayContent是一个非常具有隔离性的一个概念。处于不同DisplayContent的两个窗口在布局、显示顺序以及动画处理上不会产生任何耦合。因此,就这几个方面来说,DisplayContent就像一个孤岛,所有这些操作都可以在其内部独立执行。因此,这些本来属于整个WMS全局性的操作,变成了DisplayContent内部的操作了。

  • WindowState 表示一个窗口的所有属性,所以它是WMS中事实上的窗口;当向WMS添加一个窗口时,WMS会为其创建一个WindowState。另外WMS.addWindow()函数中看到新的WindowState被保存到mWindowMap中,键值为IWindow的Bp端。mWindowMap是整个系统所有窗口的一个全集。

2.4 removeWindow

void removeWindow(Session session, IWindow client) {synchronized (mGlobalLock) {//获取WindowStateWindowState win = windowForClientLocked(session, client, false);if (win != null) {//执行删除win.removeIfPossible();return;}// Remove embedded window map if the token belongs to an embedded windowmEmbeddedWindowController.remove(client);}}

win.removeIfPossible方法和它的名字一样, 并不是直接执行删除操作,而是进行多个条件判断过滤,满足其中一个条件就会return,推迟删除操作。比如View正在运行一个动画,这是就会推迟删除操作直到动画完成。然后调用removeImmediately方法。

3. 事件派发

EventHub:
1.使用inotify监听输入设备的添加和移除;
2.使用epoll机制监听输入设备的数据变化;
3.读取设备文件数据;
4.将原始数据返回给InputReader;

InputReader:不断读取由EventHub监听到的input事件,将多个事件组合成一个可供上层消费的事件(比如将一组触摸事件合并成一个action_down事件),然后交给InputDispatcher进行事件分发;

InputDispatcher:拿到InputReader获取的事件后,对事件进行包装,寻找并分发到目标窗口,对应inputChannel输入;

Android系统是由事件驱动的,而input是常见的事件之一,点击、滑动、长按等操作,都属于input事件,核心类就是InputReader和InputDispatcher;

解释: ViewRootImpl#WindowInputEventReceiver:从下面源码可以看出,此类用于InputChannel输入事件接收以及处理输入事件分发;

    final class WindowInputEventReceiver extends InputEventReceiver {//构造方法,接受inputchannel输入事件public WindowInputEventReceiver(InputChannel inputChannel, Looper looper) {super(inputChannel, looper);}@Overridepublic void onInputEvent(InputEvent event) {...if (processedEvents != null) {if (processedEvents.isEmpty()) {// InputEvent consumed by mInputCompatProcessorfinishInputEvent(event, true);} else {for (int i = 0; i < processedEvents.size(); i++) {//对输入事件进行分发enqueueInputEvent(processedEvents.get(i), this,QueuedInputEvent.FLAG_MODIFIED_FOR_COMPATIBILITY, true);}}} else {enqueueInputEvent(event, this, 0, true);}}

ViewRootImpl#InputStage:抽象类,主要用来将事件的处理分成若干个阶段(stage)进行,如果该事件没有被处理,则该stage就会调用onProcess方法处理,然后调用forward执行下一个stage的处理;如果该事件被标识为处理则直接调用forward,执行下一个stage的处理,直到没有下一个stage;

ViewPostImeInputStage:InputStage的子类,将输入事件传递到上层视图;至此,输入事件一层层向上传递,最终交由具体的view进行处理;

如果你还没有掌握Framework,现在想要在最短的时间里吃透它,可以参考一下《Android Framework核心知识点》,里面内容包含了:Init、Zygote、SystemServer、Binder、Handler、AMS、PMS、Launcher……等知识点记录。

《Framework 核心知识点汇总手册》:https://qr18.cn/AQpN4J

Handler 机制实现原理部分:
1.宏观理论分析与Message源码分析
2.MessageQueue的源码分析
3.Looper的源码分析
4.handler的源码分析
5.总结

Binder 原理:
1.学习Binder前必须要了解的知识点
2.ServiceManager中的Binder机制
3.系统服务的注册过程
4.ServiceManager的启动过程
5.系统服务的获取过程
6.Java Binder的初始化
7.Java Binder中系统服务的注册过程

Zygote :

  1. Android系统的启动过程及Zygote的启动过程
  2. 应用进程的启动过程

AMS源码分析 :

  1. Activity生命周期管理
  2. onActivityResult执行过程
  3. AMS中Activity栈管理详解

深入PMS源码:

1.PMS的启动过程和执行流程
2.APK的安装和卸载源码分析
3.PMS中intent-filter的匹配架构

WMS:
1.WMS的诞生
2.WMS的重要成员和Window的添加过程
3.Window的删除过程

《Android Framework学习手册》:https://qr18.cn/AQpN4J

  1. 开机Init 进程
  2. 开机启动 Zygote 进程
  3. 开机启动 SystemServer 进程
  4. Binder 驱动
  5. AMS 的启动过程
  6. PMS 的启动过程
  7. Launcher 的启动过程
  8. Android 四大组件
  9. Android 系统服务 - Input 事件的分发过程
  10. Android 底层渲染 - 屏幕刷新机制源码分析
  11. Android 源码分析实战

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/28728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧图书馆:数字发展时代的文化粮仓

以下内容来自于易知微官网&#xff0c;进入官网可以了解更多详情。 注意&#xff1a;案例数据均为虚拟数据 书籍犹如灯塔指引着人们前进的方向&#xff0c;同时图书馆也是一个城市的灵魂。图书馆在为我们提供学习场所的同时&#xff0c;也在城市文明建设过程中起着不可替代的…

Linux下查询文件夹中文件数量的方法

一、前言 在Linux系统中&#xff0c;我们经常需要查询文件夹中包含多少文件。本文将介绍三种在Linux中查询文件夹中文件数量的方法&#xff0c;帮助你轻松获取所需信息。 二、方法 1、使用ls命令和wc命令 使用ls命令的-l选项和管道操作符|结合wc命令来统计文件数量&#xf…

事件循环原理

事件循环 浏览器的进程模型 何为进程&#xff1f; 程序运行需要有它自己专属的内存空间&#xff0c;可以把这块内存空间简单的理解为进程 每个应用至少有一个进程&#xff0c;进程之间相互独立&#xff0c;即使要通信&#xff0c;也需要双方同意。 何为线程&#xff1f; 有…

Kubernetes 初接触

Kubernetes 初接触 一、Kubernetes 概述1.1 K8S 是什么&#xff1f;1.2 为什么要用 K8S?1.3 Kubernetes 主要功能 二、Kubernetes 集群架构与组件2.1 核心组件2.1.1 Master 组件2.1.1.1 这些控制器主要包括 2.1.2 配置存储中心2.1.3 Node 组件 2.2 Kubernetes 核心概念2.2.1 P…

Oracle Cloud 开启 root 权限登录甲骨文VPS

利用脚本来开启root账号密码登录 echo root:S123456 |sudo chpasswd root sudo sed -i s/^#\?PermitRootLogin.*/PermitRootLogin yes/g /etc/ssh/sshd_config; sudo sed -i s/^#\?PasswordAuthentication.*/PasswordAuthentication yes/g /etc/ssh/sshd_config; sudo servi…

企业邮箱安全对比:哪家公司的产品更可靠?

邮箱仍然是企业沟通的关键组成部分&#xff0c;但往往容易受到安全威胁。为了保护敏感信息&#xff0c;企业需要采取措施使企业邮箱更加安全。这可以通过投资先进的安全解决方案&#xff0c;创建限制或控制访问的策略&#xff0c;并定期对员工进行最佳实践培训来实现。 1、投资…

SpringBoot+JWT

一、maven坐标 <!-- JWT依赖 --><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency><dependency><groupId>com.auth0</groupId>&…

前端页面如何创建表格?table的结构、属性有哪些?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ HTML是什么&#xff1f;⭐ table标签的属性⭐ 注意事项⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏…

java动态生成excel并且需要合并单元格

java动态生成excel并且需要合并单元格 先上图看一下预期效果 集成poi <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.0.0</version> </dependency> <dependency><…

c++文件流详细笔记

c++流 IO :向设备输入数据和输出数据 C++的IO流 设备: 文件控制台特定的数据类型(stringstream)c++中,必须通过特定的已经定义好的类, 来处理IO(输入输出) 文件流 文件流: 对文件进行读写操作 头文件: 类库: ifstream 对文件输入(读文件) ofstream 对文件输出(写…

聪明灵犀:智能AI写作助手

这是一款支持AI写作和AI聊天的智能软件&#xff0c;利用先进的自然语言处理技术&#xff0c;为用户提供个性化、高效的服务和帮助。可以借助该软件轻松完成各类文案创作&#xff0c;提升写作效率&#xff1b;也可以通过AI聊天的方式&#xff0c;来解决各种问题。内置实用AI工具…

Element Plus 配置Icon图标自动导入未生效

官方给的自动导入配置文件 import path from path import { defineConfig } from vite import Vue from vitejs/plugin-vue import Icons from unplugin-icons/vite import IconsResolver from unplugin-icons/resolver import AutoImport from unplugin-auto-import/vite imp…

【MySQL】select相关

文章目录 迭代器distinct 关键字limit offset 关键字order by 列名 asc\descselect语句的执行顺序几点注意 迭代器 指向第一个元素 使用hasNext()进行判断后才进行取元素 resultSet&#xff1a;指向第一个元素前一个 distinct 关键字 去除一列中的重复元素 可以进行多行的去重…

常用 JVM 调优工具

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ JVM 日常调优总结起来就是&#xff1a;首先通过 jps 命令查看当前进程&#xff0c;然后根据 pid 通过 jinfo 命令查看和修改 jvm 参数&#xff0c;通过 jstat 命令查看 cla…

rust 安装

配置环境变量 该方式可以决定 cargo、rustup 存放位置&#xff0c;默认存放在 C:\Users\你的用户名 中。如果需要修改&#xff0c;请在 cmd 中执行以下命令&#xff0c;路径可以自己修改&#xff1a; setx CARGO_HOME "D:\rust\cargo" setx RUSTUP_HOME "D:\r…

商品控价的流程有哪些

品牌要做好控价&#xff0c;流程其实不复杂&#xff0c;并且可以形成体系去做&#xff0c;不管针对哪个渠道&#xff0c;用下面这套流程去做&#xff0c;可以降低品牌的控价成本&#xff0c;提长品牌的控价效果。 首先&#xff0c;找一家合适的第三方控价公司 选择有时候比执行…

GD32F103VE串口与DMA传输

GD32F103VE串口与DMA传输&#xff0c;本测试采用的的串口1和DMA0之间的数据传输&#xff0c;然后通过RS485和其它设备进行数据交换&#xff0c;没有采用任何中断参与。 GD32F103VE的DMA0请求映射到串口&#xff1a; 1&#xff0c;USART0_RX映射到DMA0的通道4&#xff0c;USART…

openCV 图像色彩空间转换

文章目录 一、cvColor二、HSV/BGR三、imwrite void QuickDemo::colorSpce_Demo(cv::Mat &image) {cv::Mat gray, hsv;cvtColor(image, hsv, COLOR_BGR2HSV);cvtColor(image, gray, COLOR_RGB2GRAY);imshow("hsv", hsv);imshow("gray", gray);imwrite(&…

FFmpeg 硬编码VideoToolBox流程

介绍 FFmpeg已经提供对 VideoToolBox 的编解码支持&#xff1b;主要涉及到的文件有videotoolbox.c、videotoolbox.h、videotoolboxenc.c、ffmepg_videotoolbox.c。在编译 FFmpeg 源码时&#xff0c;想要支持VideoToolBox&#xff0c;在 configure 时&#xff0c;需要–enable-…

艺术创作的新纪元:如何训练Lora模型打造令人惊叹的AI绘画

目录 前言一、&#x1f981; 选择合适的云端平台1-1、云端平台的优势1-2、选择适合的云端平台 二、&#x1f981; 账号注册三、&#x1f981; 开始炼丹3-1、购买算力并创建工作空间3-2、启动工作空间3-3、应用市场一键安装 四、&#x1f981; 使用Stable-Diffusion作图4-1、国风…