【Android】WMS(一)Window的类型和标志

news2024/11/28 14:40:17

Window、WindowManager、WMS区别

在这里插入图片描述

Window:

Window 是 Android 中的一个视图容器,代表整个屏幕或 Activity 的一部分。每个 Window 都有自己的 Surface 对象,Surface 对象具有绘制和渲染功能,可以显示 View 和其他元素。在 Android 应用程序中,我们可以使用 setContentView() 方法设置一个布局文件来创建 Window。

WindowManager:

在这里插入图片描述

WindowManager 是一个系统服务,主要负责管理所有窗口(Window)的显示和相关操作。通过 WindowManager,我们可以访问当前显示的所有窗口。WindowManager 是 Android 系统中最核心的窗口管理组件之一,也是我们在 Android 应用程序中实现自定义窗口的基础。

WMS (Window Manager Service):

在这里插入图片描述

WMS 是 Android 系统中的一个系统服务,也是 WindowManager 的核心部分,主要负责协调和管理所有的窗口。WMS 确定每个窗口的大小、位置和显示顺序,以及响应用户的输入事件。同时,WMS 还负责设置窗口的属性,如 type、flag 等,并执行窗口的动画效果。

Window 是布局视图的容器,WindowManager 是管理窗口显示的服务,WMS 是 WindowManager 的核心,用于协调和管理所有的窗口。WindowManager 和 WMS 都是 Android 系统中非常基础和重要的组件,而 Window 则是应用程序布局的基础。


WindowManager 是一个接口,它继承自 ViewManager,ViewManager 中定义了三个抽象方法,分别用于添加、更新和移除 View。而 WindowManager 接口则继承了这三个方法,并为窗口管理器提供了基本的能力。

WindowManagerImpl 是 WindowManager 的实现类,它实现了 WindowManager 接口,并提供了更具体的功能。在 WindowManagerImpl 的实现过程中,它会使用 WindowManagerGlobal 来协调和管理所有的窗口。WindowManagerGlobal 是一个静态单例对象,它在加载 WindowManagerImpl 时就被创建出来,并在整个 Android 系统中负责协调和管理所有窗口的显示和操作。


Window的类型

Window 的类型有很多种,比如应用程序窗口、系统错误窗口、输入法窗口、PopWindow、Toast、Dialog 等。总的来说 Window 分为三大类型,分别是 Application Window(应用程序窗口)Sub Window(子窗口)System Window (系统窗口),每个大类型中又包含了很多种类型,它们都定义在 WindowManager 的静态内部类 LayoutParams 中.

应用程序窗口

应用程序窗口是特定应用程序内部存在的窗口,可以是全屏窗口或者普通窗口。例如,在我们使用浏览器进行网页浏览时,浏览器的应用程序窗口就是全屏窗口;而在我们观看视频时,播放器的应用程序窗口就是普通窗口。应用程序窗口的类型由 WindowManager 类的常量值定义,其 Type 值范围为 1~99,代表着窗口的层级。应用程序窗口可以对应应用程序内不同的 Activity,可以进行添加、删除、修改等操作。

例如:

TYPE_APPLICATION:应用程序窗口,占据整个屏幕。

TYPE_APPLICATION_PANEL:应用程序面板窗口,在应用程序窗口之上,但能被覆盖。

TYPE_APPLICATION_ATTACHED_DIALOG:应用程序附加对话框窗口,与父 Activity 关联,当 Activity 消失时会自动消失。

TYPE_APPLICATION_MEDIA:应用程序媒体窗口,用于播放视频和音频。

子窗口

子窗口是依附于父窗口之上的窗口,不具有独立性。例如,在我们使用微信聊天时,聊天记录的对话框就是子窗口。子窗口的类型也由 WindowManager 类的常量值定义,其 Type 值范围从 1000~1999。子窗口是建立在应用程序窗口之上的,也就是说,他们必须依附于某个应用程序窗口之上,但是他们可以通过 WindowManager.LayoutParams 类的相关参数(如 parent、token 参数)来改变自己的层级,从而达到弹出效果。

例如:

TYPE_APPLICATION_SUB_PANEL:应用程序子面板窗口。

TYPE_APPLICATION_TOP_MOST:应用程序最顶层窗口。

TYPE_SYSTEM_ALERT:系统警告窗口,显示系统级的警报信息,例如低电量警告。

TYPE_TOAST:提示窗口,用于显示简短的消息。

系统窗口

系统窗口是系统级别的窗口,通常用于显示系统级别的信息或者对话框,例如 Toast、输入法窗口、系统音量条窗口、系统错误窗口等。它们都属于系统级别的应用程序,具有比较高的优先级和权限。系统窗口的类型也由 WindowManager 类的常量值定义,其 Type 值范围为 2000~2999。相对于应用程序窗口和子窗口,系统窗口的层级最高,因此它们总是能够出现在屏幕的最上层,即使是该应用程序的活动窗口正在显示中。

例如:

TYPE_STATUS_BAR:状态栏窗口,显示系统状态,例如时间、电量等。

TYPE_NAVIGATION_BAR:导航栏窗口,是一个系统级别的窗口,用于控制屏幕导航。

TYPE_INPUT_METHOD:输入法窗口,显示用户输入的文本。

TYPE_SYSTEM_OVERLAY:系统覆盖窗口,它可以放置在所有其他窗口的上面。


Window的标志

Window的标志(Flag)是一种用于控制窗口行为的选项,它可以指定窗口是否应该在锁屏界面之上显示、窗口是否自动点亮屏幕等等。

以下是常用的几个Window Flag的介绍:

FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
使用该标志后,当窗口可见时,即使设备处于打开状态但在锁屏状态下,仍允许在屏幕上锁屏。这主要是针对一些情况下需要保持屏幕亮着而又不能操作时很有用,比如让用户只观看某些特定内容不可操作,此时屏幕保持亮着而不会滑入待机状态。

FLAG_NOT_FOCUSABLE
仅当窗口无须获得输入焦点时,才应设置此标志。设置该标志意味着,当用户触摸并选择该窗口时,该窗口不会接收到任何输入事件。

FLAG_NOT_TOUCHABLE
使用该标志后,窗口将不会响应任何触摸事件。

FLAG_NOT_TOUCH_MODAL
指定窗口在处理触摸事件时,是否限制在当前窗口内。如果使用这个标志,则该窗口外的任何触摸事件都将被传递给下面的窗口。

FLAG_KEEP_SCREEN_ON
该标志确保屏幕保持开启状态,直到从当前窗口移除或清除FLAG_KEEP_SCREEN_ON标志。

FLAG_LAYOUT_NO_LIMITS
使用该标志可以使窗口超出屏幕尺寸而不会被截断。这个标志通常用于应用程序需要在特殊情况下覆盖全屏幕的场景。

FLAG_FULLSCREEN
指定窗口在全屏模式下呈现,隐藏状态栏和导航栏。比如在游戏和视频播放时使用。

FLAG_SHOW_WHEN_LOCKED
使用该标志后,即使设备处于锁屏状态,该窗口也能显示在锁屏界面之上。这个标志通常使用于闹钟、电话来电等应用场景。

FLAG_IGNORE_CHEEK_PRESSES
当用户在通话过程中将自己的脸靠近屏幕时,该标志告知系统不要响应触摸事件。这个标志通常用于防止带有接近检测芯片的设备因触摸而产生额外的误操作。

FLAG_TURN_SCREEN_ON
此标志允许屏幕在显示窗口时点亮,以确保接收到最新信息,例如来电提醒等。

设置 Window 的 Flag 有 3 种方法

通过 Window 的 addFlag 方法

该方法用于向 Window 中添加一个 Flag,每次调用该方法只能添加一个 Flag。若要添加多个 Flag,需要多次调用该方法。

   Window mWindow = getWindow();
   mWindow.addFlag(WindowManager.LayoutParams.FLAG_FULLSCREEN);

需要注意的是,该方法添加的 Flag 仅在当前 Activity 或对话框打开时有效,当 Activity 或对话框关闭后,添加的 Flag 也会被清除。

通过 Window 的 setFlags 方法

该方法用于设置 Window 的 Flag,可以同时设置多个 Flag,将多个 Flag 通过按位或操作进行合并即可。该方法可以用于在 Activity 创建后、onCreate 方法调用前进行 Flag 的设置。

   Window mWindow = getWindow();
   mWindow.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN)

使用该方法需要注意,若要给 Window 设置多个 Flag,需将所有 Flag 合并后再传入第二个参数中,而不能像 addFlag 方法一样逐个添加。

给 LayoutParams 设置 Flag, 并通过 WindowManager 的 addView 方法进行添加

该方法一般用于在系统级别的 View 上设置 Flag,例如悬浮窗。我们需要创建一个 WindowManager.LayoutParams 实例,然后将需要的 Flag 设置到该实例的 flags 属性中,最后通过 WindowManager 的 addView 方法将 View 添加到窗口中。

   WindowManager.LayoutParams mWindowLayoutParams = new WindowManager.LayoutParams();
   mWindowLayoutParams.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN;
   WindowManager mWindowManager = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
   Text mText = new Text(this);
   mWindowManager.addView(mTextView,mWindowLayoutParams);

需要注意的是,该方法添加的 Flag 仅在 View 显示期间有效,当 View 移除后,添加的 Flag 也会被清除。

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

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

相关文章

Vue 的基础知识 - 判断, 循环, 事件, 通信

目录 1. 了解 Vue 七大常用属性 2. 文本插值 2.1 v-bind 绑定元素 3. 判断 4. 循环 5. 事件 6. 双向绑定 7. 自定义组件 8. Axios 异步通信 8.1 什么是Axios 8.2 为什么要使用 Axios 8.3 Axios 的简单应用 8.4 Vue 的生命周期 1. 了解 Vue 七大常用属性 1. el 属性…

Qt扫盲-Bar柱状图理论

Bar柱状图理论 一、QAbstractBarSeries1. 常用设置2. 管理 BarSet 二、QBarSerie 和 QHorizontalBarSeries1. 垂直柱状图2. 水平柱状图 二、QPercentBarSeries 和 QHorizontalPercentBarSeries1. 垂直比例图2. 水平比例图 三、QStackedBarSeries 和 QHorizontalStackedBarSerie…

忠诚之源:如何获得铁粉?

文章目录 一、铁粉二、如何吸引和留住铁粉的想法2.1 了解你的目标铁粉2.2 提供有价值的内容2.3 建立良好的关系2.4 持续优化和创新 三、具体可采用的一些方法3.1 提供优质内容3.2 社交媒体互动3.3 创建独特的品牌形象3.4 提供特殊待遇和奖励3.5 参与社区和活动3.6 持续互动和更…

如何把视频语音转换成文字,分享给大家几个免费的方法!

在日常工作和学习中,有时需要将视频中的语音转录为文字,以便整理成文稿或进行其他用途。手动打字效率低下且耗时费力,那么如何快速将语音转换为文字呢?下面介绍几种简单高效的方法,其中之一是使用记灵在线工具。 方法…

PHP的流程控制语句

一.流程控制语句 1.if语句 PHP的if语句格式如下 if(表达式) 语句; 如果表达式的值为真,那么久顺序执行语句;否则,就会跳过该条语句,再往下执行。如果要执行的语句不指一条则用{},{}被称为语句组,格式如…

Immer编写简洁的更新state逻辑

react官网推荐库use-immer:https://www.npmjs.com/package/use-immer 引入:import { useImmer } from "use-immer"; 优点: 简化代码: 只需要关注需要变动的部分,而 immer 本身将在后台处理其余部分。学习成本和替换代…

双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的实践应用

查看原文>>>双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的实践应用 目录 第一讲、DNDC模型介绍 第二讲、DNDC初步操作 第三讲、遥感和GIS基础 第四讲、DNDC气象数据 第五讲、DNDC土地数据 第六讲、DNDC土壤数据 …

【C语言】算法学习·Dijkstra算法详解

目录 Dijkstra算法设计 Dijkstra算法简介 Dijkstra算法的基本思想 Dijkstra贪心策略 完美图解 伪代码详解 完整代码 算法解析及优化拓展 ​使用优先队列的完整代码 Dijkstra算法设计 Dijkstra算法简介 Dijkstra算法是解决**单源最短路径**问题的**贪心算法** …

2021年国赛高教杯数学建模C题生产企业原材料的订购与运输解题全过程文档及程序

2021年国赛高教杯数学建模 C题 生产企业原材料的订购与运输 原题再现 某建筑和装饰板材的生产企业所用原材料主要是木质纤维和其他植物素纤维材料,总体可分为 A,B,C 三种类型。该企业每年按 48 周安排生产,需要提前制定 24 周的原材料订购和…

如何在 javascript 中按属性值查找数组中的对象

文章目录 使用 find() 方法按属性值在数组中查找对象使用 filter() 方法按属性值查找数组中的对象使用 JavaScript for 循环按属性值查找数组中的对象使用 JavaScript for...in 循环按属性值查找数组中的对象 数组指的是值的有序列表,每个值称为由索引指定的元素。 …

这所西安的985专硕爆冷,保护一志愿,过线即上岸!

本期为大家整理热门院校“西北工业大学”的择校分析,这个择校分析专题会为大家结合:初试复试占比、复试录取规则(是否公平)、往年录取录取名单、招生人数、分数线、专业课难度等进行分析。希望能够帮到大家! –所有数据来源于研招…

Plot、Scatter、Subplot函数用法

目 录 一、Plot()函数 二、Scatter()函数 三、Subplot()函数 一、Plot()函数 格式:matplotlib.pyplot.plot(x,y,format_string.**kwargs) 说明: x:x轴数据,列表或数组,可选(注:当绘制多条曲线时,不能省…

IT 系统巡检必须关注的指标总结

1. 系统整体架构 以下内容作为基本 IT 系统信息被首先调查记录,供分析参考使用。 ● 网络设备配置 ---设备型号, IOS 版本, 模块型号和数量,用途 ● 存储系统配置 ---设备型号, IO 带宽, Cache 容量,磁盘数量,接入模式,存储容…

Go项目配置管理工具---Viper

目录 Viper概述前言功能viper配置优先级 从Viper中获取值读取配置文件注册和使用别名 把值写入Viper设置默认值使用Set方法设置值把配置信息写入配置文件从io.Reader中读取配置信息到viper 监控Viper文件 Viper概述 前言 对于现代应用程序,尤其大中型的项目来说&a…

【MySQL】Mycat

文章目录 什么是Mycat为什么要用Mycatmycat能干什么各数据库中间件对比Mycat原理数据库中间件逻辑库逻辑表分片表分片规则全局表ER表非分片表分片节点节点主机mycat安装mycat核心配置schema.xmlserver.xmlrule.xml加密明文密码(可选) MyCat读写分离垂直拆…

OpenCV中的图像处理3.11(10) OpenCV中的图像变换

目录 3.11 OpenCV中的图像变换3.11.1 傅里叶变换目标理论Numpy中的傅里叶变换OpenCV中的傅立叶变换DFT的性能优化为什么Laplacian是一个高通滤波器?其他资源 翻译及二次校对:cvtutorials.com 编辑者:廿瓶鲸(和鲸社区Siby团队成员&…

2.3 YARN伪分布式集群搭建

任务目的 重点掌握 YARN 集群的相关配置学会启动和关闭 YARN 集群的两种方式能够使用 jps 命令查看进程的启动情况能够通过 UI 查看 YARN 集群的运行状态任务清单 任务1:YARN 集群主要配置文件讲解任务2:YARN 集群测试任务步骤 任务1:YARN 集群主要配置文件讲解 1.1 配置环…

基于多尺度图神经网络的流场预测,实现精度与速度的平衡

项目简介 本项目来源于飞桨AI for Science共创计划的论文复现赛题,复现论文为《AMGNET: multi-scale graph neural networks for flow field prediction》。该论文主要采用图神经网络,因为在计算流体力学中计算域被网格离散化,这与图结构天然…

将PDF1页分割为4页

运行效果 原始PDF 分割后PDF 一、python代码(用的是python3.9.0版本) import os import tempfile from pdf2image import convert_from_path from PIL import Image from PyPDF2 import PdfReader, PdfWriterdef split_pdf_page(pdf_path, output_path…

4G开发板-安卓手机开发套件-MTK主板开发板定制

开发板是一种用于嵌入式系统开发的电路板,它包含了各种硬件组件,如中央处理器、存储器、输入设备、输出设备、数据通路/总线以及外部资源接口等。为了满足特定的开发需求,嵌入式系统开发者通常会根据项目要求来定制开发板,当然用户…