【Android】WMS(二)Window的添加

news2024/11/27 13:50:11

软件盘相关模式

在 Android 应用开发中,软键盘的显示与隐藏是一个经常出现的问题,而 WindowManager 的 LayoutParams 中定义的软键盘相关模式则为开发者提供了一些解决方案。

其中,SoftInputMode 就是用于描述软键盘的显示方式和窗口的调整方式的属性。常用的几个 SoftInputMode 的作用:

SOFT_INPUT_STATE_UNSPECIFIED:没有设定状态,系统会选择一个合适的状态或依赖于主题的设置。

SOFT_INPUT_STATE_UNCHANGED:不会改变软键盘状态,即如果软键盘已经弹出,它将会保持弹出状态;如果软键盘未弹出,它将保持未弹出状态。

SOFT_INPUT_STATE_ALWAYS_HIDDEN:当窗口获取焦点时,软键盘总是被隐藏,即使输入焦点在文本框内。

SOFT_INPUT_ADJUST_RESIZE:当软键盘弹出时,窗口会调整大小,以保证输入焦点始终可见。如果输入框被遮挡,窗口会根据输入法的高度自动调整大小,从而保证输入框可见。

SOFT_INPUT_ADJUST_PAN:当软键盘弹出时,窗口不需要调整大小,但是要确保输入焦点是可见的。如果输入框被遮挡,窗口会自动滚动,从而保证输入框可见。

SOFT_INPUT_STATE_HIDDEN:当用户进入该窗口时,软键盘默认隐蔽,即不管输入焦点在哪里,软键盘都不会弹出。

通过 setSoftInputMode 方法可以设置当前 Activity 的软键盘模式。例如,setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) 可以实现当软键盘弹出时,窗口会调整大小以保证输入焦点始终可见。

需要注意的是,使用 setSoftInputMode 方法只能针对当前 Activity 起作用,如果希望应用程序中的所有 Activity 均按照同样的方式显示软键盘,需要在 AndroidManifest.xml 中为每个 Activity 配置 android:windowSoftInputMode 属性。

也可以在代码中这样实现

geWindow().setSoftInputMode(MindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

Window的添加

在这里插入图片描述

在 Android 应用开发中,Window 是一个抽象概念,它表示屏幕上的一个矩形区域,可以在上面绘制 UI 元素,并处理用户输入事件。WindowManager 是负责管理和控制这些窗口的系统服务。

在 Activity 的生命周期中,当调用 attach() 方法时,会创建 PhoneWindow 对象,并同时创建一个 WindowManagerImpl 实例来维护 PhoneWindow 内的内容。PhoneWindow 表示应用程序窗口的实体内容,而 WindowManagerImpl 则负责实现窗口的添加、删除、更新等操作。

在 Activity 的 onCreate() 方法中,通常会调用 setContentView() 方法来设置布局资源,这个方法内部会创建一个 DecorView 实例作为 PhoneWindow 的实体内容,同时将该视图添加到 WindowManagerImpl 管理的窗口列表中。DecorView 是一个特殊的 View,它包含所有 UI 控件,并为其提供一个基础框架,比如标题栏、状态栏、背景等。

WindowManagerImpl 会决定管理 DecorView,并创建一个 ViewRootImpl 实例,将 ViewRootImpl 与 View 树进行关联,这样 ViewRootImpl 就可以指挥View树的具体工作,包括测量、布局和绘制等操作。ViewRootImpl 是一个核心组件,它作为控制器,负责处理系统消息队列、与 WindowManagerService 通信、触发 View 树的渲染等任务。

总结:Window 的添加是通过创建 PhoneWindow 和 DecorView 实例,将其加入 WindowManagerImpl 管理的窗口列表中,并创建 ViewRootImpl 实例来实现的。这个过程可以通过 setContentView() 和 attach() 方法自动完成,也可以使用代码手动添加窗口。


DecorView

在这里插入图片描述

在一个 Activity 或 Dialog 中,都包含了一个 Window 窗口,而 Window 并不是实际的页面内容,而是通过 View 来表达页面内容。这个 View 就是 DecorView

DecorView 是 FrameLayout 的子类,它可以被认为是 Android 视图树的根节点视图。在 Activity 的生命周期 onCreate() 方法中,通常会调用setContentView(布局id)方法,这个方法内部会使用 XML 解析器将布局文件转化为一个 View,然后将该 View 添加到 DecorView 中去,成为唯一的子 View

DecorView 扮演着非常重要的角色,它除了作为整个视图树的根节点外,还负责处理窗口的系统事件,比如键盘事件、触摸事件等。同时,DecorView 也会负责测量、布局和绘制其所有子 View,以及提供基础框架,比如标题栏、状态栏、背景等。

需要注意的是,DecorView 的内容通常是由应用程序定义的主题样式所决定的,这意味着它可以随着应用程序主题的变化而自动改变。例如,当应用程序的主题样式更改为深色模式时,DecorView 的内容也会相应地进行调整。

总结:DecorView 是 Android 视图树的根节点视图,它扮演着重要的角色,负责处理窗口事件、测量、布局和绘制子 View 等任务,并提供基础框架。同时,DecorView 的内容通常由应用程序主题样式所决定,支持随主题变化而自动调整。


WindowManagerGlobal

在这里插入图片描述

WindowManagerGlobal 是一个单例类,一个进程只有一个实例。它负责管理所有 Window 相关的 ViewRootImplDecorViewLayoutParams

在 WindowManagerGlobal 中,有三个集合分别存储了所有 Window 的 DecorView、对应的 ViewRootImpl 和布局参数 LayoutParams。其中,DecorView 是 Window 的实际内容,ViewRootImpl 是管理 DecorView 的核心组件,LayoutParams 则是控制 Window 布局和显示的参数。

WindowManagerGlobal 提供了一些方法来增加、移除、查找 Window,比如 addView()removeView()getRootView() 等。在 Activity 中,调用 setContentView() 时就会隐式地添加一个新的 Window,这时 WindowManagerGlobal 就会创建相应的 DecorView 和 ViewRootImpl,并将它们添加到对应的集合中。当 Activity 被销毁时,相关的 Window 也会被自动移除。

需要注意的是,WindowManagerGlobal 的作用范围是整个进程,因此多个 Activity 共享同一个 WindowManagerGlobal 实例,这也意味着如果一个 Activity 更改了 WindowManagerGlobal 的状态,可能会影响到其他 Activity。因此,开发者在使用 WindowManagerGlobal 时需要特别小心,避免出现不必要的问题。

总结:WindowManagerGlobal 是一个单例类,用于管理所有 Window 相关的 ViewRootImpl、DecorView 和 LayoutParams。它提供了一些方法来增加、移除、查找 Window,但需要注意多个 Activity 共享同一个 WindowManagerGlobal 实例可能会带来的潜在问题。


ViewRootImpl

ViewRootImpl 是 View 树的树根,但它本身不是 View,而是实现了 View 与 WindowManager 之间的通信协议。在 WindowManagerGlobal 中的 addView() 方法中会创建 ViewRootImpl 对象,并把它设置为顶层 DecorView 的 ViewParent。

ViewRootImpl 负责管理整个 View 树,它是 View 系统中的核心组件之一。它可以触发 View 的测量、布局和绘制等操作,同时也是输入响应的中转站,负责将输入事件传递给正确的 View,并处理 View 返回的事件结果。

在 Android 系统中,ViewRootImpl 还承担了与 WindowManagerService(WMS)进行进程间通信的任务。当有新的 Window 添加到系统中时,ViewRootImpl 会向 WMS 发送消息,告知其窗口的大小、位置、类型等信息。同时,ViewRootImpl 也会接收来自 WMS 的指令,比如强制关闭某个窗口、改变窗口大小等。

需要注意的是,每个 Activity 中的 ViewRootImpl 都只负责管理其对应的 View 树,它们之间互不干扰。而且,一个 ViewRootImpl 只能对应一个 Window,如果需要创建多个 Window,则需要创建多个 ViewRootImpl。

总结:ViewRootImpl 是 View 树的树根,负责管理整个 View 树的测量、布局和绘制,以及输入响应的中转站。它还承担了与 WindowManagerService 进行进程间通信的任务,每个 Activity 中的 ViewRootImpl 都只负责管理其对应的 View 树。

View 树的测量、布局和绘制

触发 View 树的测量、布局和绘制操作需要调用 performMeasure()、performLayout() 和 performDraw() 方法。这三个方法都是在 ViewRootImpl 类中定义的。

首先,performMeasure() 方法会从根节点向下遍历 View 树,完成所有 ViewGroup 和 View 的测量工作。它会计算出所有 ViewGroup 和 View 显示出来需要的高度和宽度,并将结果保存到对应的 MeasureSpec 中。

然后,performLayout() 方法会从根节点向下遍历 View 树,完成所有 ViewGroup 和 View 的布局计算工作。它会根据测量出来的宽高及自身属性,计算出所有 ViewGroup 和 View 在屏幕上的显示区域,并将结果保存到对应的 LayoutParams 中。

最后,performDraw() 方法会从根节点向下遍历 View 树,完成所有 ViewGroup 和 View 的绘制工作。它会根据布局过程计算出的显示区域,将所有 ViewGroup 和 View 的当前需显示的内容画到屏幕上。

与WMS通信

在这里插入图片描述

当需要向 WindowManagerService (WMS) 发送请求时,需要借助于 IWindowSession 接口完成进程间通信。在 ViewRootImpl 类中,通过成员变量 mSession引用了 IWindowSession 接口的实例,它是一个 Binder 对象,用于进行线程间通信。而 IWindowSession 接口则是 Client 端的代理,它的 Server 端的实现为 Session。

ViewRootImpl 与 WMS 的通信可以通过 IWindowSession 完成。ViewRootImpl 会向 IWindowSession 发送消息,告知其窗口的大小、位置、类型等信息。同时,IWindowSession 也会向 ViewRootImpl 发送指令,比如强制关闭某个窗口、改变窗口大小等。

需要注意的是,在本地进程的 ViewRootImpl 想要与 WMS 进行通信,还需要经过 Session。Session 是 WMS 中的一个重要组件,它提供了一些接口用于与 View 相关的操作,并负责管理所有窗口以及处理所有窗口的事件等。

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

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

相关文章

【LeetCode】HOT 100(6)

题单介绍: 精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

python包装与授权

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

ai聊天对话工具哪种好用?这些ai对话聊天工具不要错过

在如今信息爆炸的时代,人工智能技术正在逐渐渗透到我们的生活和工作中。ai对话聊天技术作为其中的一项重要应用,吸引了越来越多的关注。但是,ai对话聊天技术并不是万能的,它需要一定的技巧和策略才能真正发挥其价值。那么&#xf…

CAN总线转串口

一、CAN总线在工程机械中的广泛应用 随着科技的进步和现代施工项目大型化的要求,新一代工程机械需要实现集成化操作和智能控制。CAN总线是国际上应用最广泛的现场总线之一。CAN总线以其高可靠性、实时性、无破坏仲裁、多主等特性,已广泛应用于工程机械中&#xff0c…

这里推荐几个前端动画效果网站

1. AnimistaAnimista 是一个 CSS 动画/转场库和在线工具。它有许多现成的 CSS 动画片段可以直接使用,也可以在线定制动画。 网站地址:Animista - On-Demand CSS Animations Library 2. Animate.cssAnimate.css 是一个免费的 CSS 动画库,里面有 Attention Seekers 、 Bouncing E…

【Java|多线程与高并发】线程安全问题以及synchronized使用实例

文章目录 1. 前言2. 线程安全问题演示3.线程安全问题的原因4.synchronized关键字5. 总结 1. 前言 Java多线程环境下,多个线程同时访问共享资源时可能出现的数据竞争和不一致的情况。 线程安全一直都是一个令人头疼的问题.为了解决这个问题,Java为我们提供了很多方式…

MySQL为什么有了redolog还需要double write buffer?

MySQL为什么有了redolog还需要double write buffer? 问题 我们知道MySQL InnoDB引擎使用redolog作为异常容灾恢复的机制,当MySQL进程发生异常退出、机器断电等,在重新启动时,使用redolog恢复。 OK,redolog是被MySQL…

进程同步与进程通信(#include <windows.h>)

目录 实验二 进程同步与进程通信 一、实验目的 二、实验内容 任务一、进程同步与互斥 任务二、进程通信 实验二 进程同步与进程通信 备注:大二(下)操作系统实验二 一、实验目的 掌握基本的同步与互斥算法,理解P&#xff…

移植蓝牙芯片后,PCM 无声音问题记录

背景:投影仪项目上的蓝牙模组本地已经验证ok,送到客户那里发现HFP打电话没声音。 1. 客户平台是3566,android 11的环境, 该环境下其他的模组是可以的 2. 在3566上安装QQ, 波通VOIP电话后, 无阴影, 3. 通过示波器接收pcm 无波形输出, 问题分析查证 1.查看HCI log ,…

【LeetCode热题100】打卡第17天:接雨水全排列旋转图像

文章目录 【LeetCode热题100】打卡第17天:接雨水&全排列&旋转图像⛅前言 接雨水🔒题目🔑题解 全排列🔒题目🔑题解 旋转图像🔒题目🔑题解 【LeetCode热题100】打卡第17天:接雨…

Elasticsearch 中文分词器

IK 分词器 我们在ES中最常用的中文分词器就是IK分词器,其项目地址为:https://github.com/medcl/elasticsearch-analysis-ik 下载安装 下载地址: https://github.com/medcl/elasticsearch-analysis-ik/releases 下载时注意和es的版本对应&a…

Network 之十二 iPXE 源码、编译过程、Linker tables 机制、移植新驱动、固件使用

最近,正在学习 iPXE 源码,于是开始各种 Google 查找 iPXE 的资料进行学习。以下就是学习过程中一些感觉比较重要的点,特此记录,以备后续查阅。 起源 上世纪 90 年代初,网卡开始在其扩展卡上包含启动 ROM,每…

2023-6-9-一天一种设计模式

🍿*★,*:.☆( ̄▽ ̄)/$:*.★* 🍿 💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥 💟💟喜欢的朋友可以关注一下&#xf…

当在浏览器截屏过曝时,应该采取的措施

一、问题来源 屏幕打开了HDR模式后,浏览器在截图的一瞬间出现色彩错误 正常情况如下: HDR截图过曝后如下: 二、解决方法 1. 关闭屏幕HDR模式 桌面右键显示设置关闭HDR选项 2. 修改浏览器选项 地址栏输入 edge://flags(Edg…

【Spring框架】初识Spirng

目录 Spring是什么?什么是容器?什么是IoC?传统开发ioc 开发(控制反转式程序开发) DI(依赖注入) Spring是什么? Spring指的是Spring Framework(Spring框架),它是一个开源框架,有着活跃而庞大的社区&#xf…

支持无线连接的头戴式耳机,双音腔结构很好听,雷柏VH800上手

平时在PC上玩游戏,除了键鼠一类的操控设备很重要之外,耳机等音频设备也很重要,我用的是头戴式耳机,这种耳机现在有无线版本,用起来很方便,而且延迟很低,可以带来更好的声画同步效果,…

在unity中如何使用chatGPT让虚拟IP动起来

1、导入chatGpt 解决AI智能回答 请根据上一篇文章进行导入:如何使用ChatGPT在unity中进行低代码快速开发?_向视科技,让您看见未来(nbhctec)的博客-CSDN博客 2、文本也有转换工具 可导入unity 插件-RT-Voice PRO 2.…

【回眸】Python入门(五)基础语法列表和词典:Python如何消灭重复性劳动

前言 本篇博客为填坑篇,这个系列的上一篇竟然是2021年的9月30更新的,离谱,差点就到断更两周年纪念日了,后续逐渐走向填坑的每一天,继续创作,希望这个系列的专栏文章能帮助到更多有需要的人。 列表 什么是列…

C++算法:有向无环图拓扑排序(领接链表)

文章目录 前言一、邻接表二、代码1、生成图2、出度、入度计算3、拓扑排序 总结 前言 前文有向无环图实现游戏技能树中我们使用了矩阵存储图的关系,可以称之为邻接矩阵。显然,链表也是可以实现的。在图结构入门一文中,我们也提到了链表存储的…

湖南大学OS-2020(另一张)期末考试解析

【特别注意】 答案来源于wolf以及网络 是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。 【试卷评析】 这张卷子很老了,我不知道具体的年份,部分题目可能有用。如果仔细研究应该会有所收获。 【试卷与答案】 一、选…