Android设置界面层级为最上层实现

Android设置界面层级为最上层实现

文章目录

  • Android设置界面层级为最上层实现
    • 一、前言
    • 二、Android设置界面层级为最上层实现
      • 1、主要代码
      • 2、后遗症
    • 三、其他
      • 1、Android设置界面层级为最上层小结
      • 2、悬浮框的主要代码
        • 悬浮框 注意事项
        • (1)权限限制
        • (2)悬浮框窗口类型
        • (3)悬浮框窗口管理
          • Activity添加悬浮框后关闭Activity的情况,没有Activity,没有Service,这个应用是存活的,为啥呢?
        • 关键窗口类型对比:
        • (4)悬浮框的正常使用
        • (5)查看当前顶层界面信息
        • (6)查看当前所有窗口
      • 3、Android对话框的使用总结
      • 4、Android 几个简单的自定义对话框介绍

一、前言

Android设置界面层级为最上层怎么实现?

正常情况设置悬浮框就可以了,悬浮框默认是最上层的。

但是Java还有个地方的代码可以设置界面再任何界面之上;

具体实现逻辑没有去分析,这个只是其他人这样分析实现了,我顺便记录一下。

真正用到的场景估计比较少,有些系统应用的唯一悬浮框界面估计会需要用到;

最后也介绍到了一些悬浮框相关的小众知识,有兴趣的可以看看。

二、Android设置界面层级为最上层实现

1、主要代码

frameworks\base\services\core\java\com\android\server\wm\Task.java

    @Overridepublic boolean isAlwaysOnTop() {boolean isinstallCts = SystemProperties.getBoolean("persist.skg.isinstall.cts", false);if (!isinstallCts) {// debug settings  return trueString pk = getBasePackageName();if (pk.equals("com.debug.dialog") || pk.equals("com.android.settings") ) {return true;}}return !isForceHidden() && super.isAlwaysOnTop();}

修改上面代码后就可以实现top的包名应用会出现在最上层;

即使悬浮框和对话框都是显示在它的下层。

如果两个应用同时是top,后面拉起的一个会显示在最上层。

实现原理这里不进行分析了,因为我没研究过!

2、后遗症

按照上面的修改会有点问题:

如果只是悬浮框显示在最上层,并且可以移动,交互上是没啥问题的;

如果最上层的是Activity 界面,按Home和后台任务无效,未添加堆栈前返回按键无法关闭界面;

因为Home之后的Launcher界面的优先级也比它低;

后台任务的界面优先级也比它低。

所以只有是悬浮框的应用或特定的系统界面可以采用这种方式设置方式设置界面层级最高级;

其他情况慎用。

三、其他

1、Android设置界面层级为最上层小结

本文是强制设置某个应用的界面为最顶层。一般不建议这样修改。

简单的理解每个界面显示系统都会判断它的级别,随后排序显示显示。
普通悬浮于应用的场景,使用系统悬浮框就可以了。

大致优先级:top>悬浮框>对话框>Activity.

如果是锁屏界面呢?在top上面还是下面?

试了一下,锁屏界面是在top应用界面上面的。锁屏界面的层级不清楚怎么样的。

2、悬浮框的主要代码

// 获取 WindowManager 服务WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);// 设置 WindowManager 布局参数WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, //悬浮框类别WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,android.graphics.PixelFormat.TRANSLUCENT);//floatingView 是某个layout对象,不能是普通的view,比如TextViewwindowManager.addView(floatingView, params);//移除它
windowManager.removeView(floatingLayout)

floatingView 示例:

//正确示例:
LinearLayout floatingView = (LinearLayout) View.inflate(this, R.layout.activity_main, null);//错误示例(传入这个floatingView会报错):
LinearLayout floatingView = findViewById(R.id.activity_demo);
悬浮框 注意事项
(1)权限限制

从 Android 6.0 (API 23) 开始,必须通过 Settings.ACTION_MANAGE_OVERLAY_PERMISSION 显式请求悬浮窗权限。

部分厂商定制系统可能进一步限制此权限。

(2)悬浮框窗口类型
  • Android 8.0 (API 26) 及以上版本必须使用 TYPE_APPLICATION_OVERLAY 类型。

  • 旧版本使用 TYPE_PHONETYPE_SYSTEM_ALERT

  • TYPE_SYSTEM_ALERT 在新版本也能使用,但是必须是系统签名权限应用。

  • 系统系统应用不常用窗口类别:

    这些类型用于系统组件,普通应用通常无法使用:
    TYPE_STATUS_BAR 描述:状态栏窗口。
    TYPE_NAVIGATION_BAR 描述:导航栏窗口。
    TYPE_INPUT_METHOD 描述:输入法窗口。
    TYPE_KEYGUARD 描述:锁屏界面窗口。
    TYPE_ACCESSIBILITY_OVERLAY 描述:无障碍服务覆盖窗口。
    TYPE_DREAM 描述:屏保窗口(Doze 模式)。
    TYPE_VOICE_INTERACTION 描述:语音交互窗口(如 Google Assistant)。
    
  • 窗口类型的层级关系(从低到高):

应用界面 < TYPE_APPLICATION_OVERLAY < TYPE_SYSTEM_ALERT < 状态栏 < 输入法 < 系统错误窗口

上面的窗口类别了解一下就可以了,有些窗口类别是需要再特定条件下才能使用的。

(3)悬浮框窗口管理

WindowManager 添加的悬浮框窗口,后面的窗口不属于应用了?

如果是demo应用的Activity添加的悬浮框,Activity界面退出后,悬浮框窗口还是会显示在系统界面上;

那么这个时候demo应用还存活吗?

使用命令:“ps -ef | grep XXX包名” 查看了一下,应用进程是在的;

即使使用后台进程列表,去除该应用,发现应用进程还在,悬浮窗口还是存在;

这种情况应该是系统清除进程过程判断当前应用有关联的窗口,所以没有kill应用进程;

使用命令 “ am force-stop XXX包名”,kill进程后,悬浮框确实关闭了。

所以说悬浮框窗口显示的前提必须要原本拉起悬浮窗口的应用必须存活。

Activity添加悬浮框后关闭Activity的情况,没有Activity,没有Service,这个应用是存活的,为啥呢?

这个和系统进程策略有关,有些系统列表的窗口就是可以不依赖Activity存在。

为啥没有Activity也能存活,具体是哪个类哪个逻辑的处理,我也不清楚!

关键窗口类型对比:
窗口类型所属层级是否允许后台存在(无 Activity/Service)
TYPE_APPLICATION应用层级不允许:依赖 Activity 存在
TYPE_APPLICATION_OVERLAY应用覆盖层级允许:可在后台独立存在(需权限)
TYPE_SYSTEM_ALERT系统层级允许:系统级窗口,可后台存在

TYPE_APPLICATION 类别的窗口,和对话框是一样类型的,不太算悬浮框了。

(4)悬浮框的正常使用

正常情况下,悬浮框的使用都是在Service拉起的,并且可以在Service实时监听数据变化更新界面显示。

(5)查看当前顶层界面信息
//普通应用正常运行,查看当前顶层界面信息
console:/ # dumpsys window | grep mFocmFocusedApp=ActivityRecord{3609e53 u0 com.example.an15/.MainActivity t66}mFocusedWindow=Window{4e5b6fa u0 com.example.an15/com.example.an15.MainActivity}
console:/ # 
console:/ # 
//Activity退出,悬浮框界面显示的时候
console:/ # dumpsys window | grep mFocmFocusedApp=ActivityRecord{85383ad u0 com.android.launcher3/.uioverrides.QuickstepLauncher t63}mFocusedWindow=Window{c1dff8 u0 com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher}

可以看到显示悬浮框界面的时候,当前顶层界面是悬浮框背后的界面,

如果是桌面应用,就是Launcher界面了。

(6)查看当前所有窗口

查看当前所有窗口命令:dumpsys window windows | grep “Window{”

这个命令能看到:当前顶层窗口,悬浮窗口,系统其他窗口信息等。

示例如下:

//*************显示悬浮窗,并且未关闭demo应用的Activity前
console:/ # 
console:/ # dumpsys window windows | grep "Window{"                            Window #0 Window{6c3345b u0 ScreenDecorOverlayBottom}:...//添加的悬浮窗口信息Window #5 Window{f3d263 u0 Sys2038:com.example.an15/com.example.an15.MainActivity}:Window #6 Window{e3472f4 u0 ShellDropTarget}:Window #7 Window{d2f67df u0 InputMethod}://当前的顶层界面信息,demo应用Window #8 Window{365bc0c u0 com.example.an15/com.example.an15.MainActivity}://其他界面信息,比如Launcher 、后台未关闭的窗口Window #9 Window{8b073fa u0 com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher}:Window #10 Window{c4d9262 u0 com.android.systemui.wallpapers.ImageWallpaper}:
...
console:/ # //***********显示悬浮窗,并且已关闭demo应用的Activity后,显示的是Launcher桌面
console:/ # 
console:/ # dumpsys window windows | grep "Window{"                            Window #0 Window{6c3345b u0 ScreenDecorOverlayBottom}://添加的悬浮窗口信息Window #5 Window{f3d263 u0 Sys2038:com.example.an15/com.example.an15.MainActivity}:Window #6 Window{e3472f4 u0 ShellDropTarget}:Window #7 Window{d2f67df u0 InputMethod}://当前的顶层界面信息,Launcher应用Window #8 Window{8b073fa u0 com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher}://其他信息界面Window #9 Window{c4d9262 u0 com.android.systemui.wallpapers.ImageWallpaper}:imeLayeringTarget in display# 0 Window{8b073fa u0 com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher}imeInputTarget in display# 0 Window{8b073fa u0 com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher}
console:/ # 

从window窗口信息,可以大致看到,window的次序信息和界面显示的是大致一致的;

前面先是显示悬浮窗口,后面显示应用窗口;

应用的悬浮窗口信息比较明显,包含了包名,其他的悬浮窗口,是一些系统的悬浮窗口信息;

悬浮窗口后面的信息,就到普通应用的Activity界面了,

第一个非悬浮窗口界面就是当前的顶层界面,后面的界面就是后台存在的界面了;

应用界面打开后,按Home返回,所有后台应用界面都会显示在上面;

不排除系统判断当前应用进程太多的情况,会杀死一些应用界面。

以前看这个信息也没注意这么多,现在看看dumpsys这些window信息对界面分析还是比较有用的。

3、Android对话框的使用总结

(一)警告对话框 AlertDialog: 一个可以有0到3个按钮, 一个单选框或复选框的列表的对话框. 警告对话框可以创建大多数的交互界面, 是推荐的类型.
(二)进度对话框 ProgressDialog: 显示一个进度环或者一个进度条. 由于它是AlertDialog的扩展, 所以它也支持按钮.
(三)日期选择对话框 DatePickerDialog: 让用户选择一个日期.
(四)时间选择对话框 TimePickerDialog: 让用户选择一个时间

原文链接:https://blog.csdn.net/wenzhi20102321/article/details/52818351

4、Android 几个简单的自定义对话框介绍

Android 对话框直接使用肯定是不好看的,如果需要添加取消和确定按钮,肯定是需要进行自定义修改的。

简单介绍一个简单的可扩展的对话框,并且支持不同类型样式,加了点小动画。

https://blog.csdn.net/wenzhi20102321/article/details/139040977

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

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

相关文章

Linux 了解篇

一、GNU 项目与 GPL 许可 &#xff08;一&#xff09;GNU 项目 GNU &#xff1a;GNU 是一个递归缩写&#xff0c;代表 "GNUs Not Unix"。GNU 项目旨在开发一个完全自由的操作系统&#xff0c;该操作系统基于 Unix 的设计理念但不包含 Unix 的代码。GNU 项目提供了大…

word 如何让公式居中,公式编号右对齐

问题&#xff1a; 如何让输入的公式居中&#xff0c;公式编号右对齐&#xff1f; 解决方法&#xff1a; 方法一&#xff1a;使用制表符 1、输入内容&#xff1a;先按一次“Tab”键&#xff08;制表符&#xff09;&#xff0c;然后键入公式&#xff0c;然后再按一次“Tab”键…

华为OD机试真题——最小循环子数组 (2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 B卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

OpenCv高阶(十七)——dlib库安装、dlib人脸检测

文章目录 前言一、dlib库简介二、dlib库安装1、本地安装&#xff08;离线&#xff09;2、线上安装 三、dlib人脸检测原理1、HOG 特征提取2、 SVM 分类器训练3、 滑动窗口搜索4、非极大值抑制&#xff08;NMS&#xff09; 四、dlib人脸检测代码1、导入OpenCV计算机视觉库和dlib机…

AD-PCB--AD20软件安装及中英文切换 DAY 2

1.软件安装 1.1 软件包下载 给你一个捷径&#xff1a; 1.2 安装过程&#xff08;安装过的人跳过就好&#xff0c;一般很多都支持懒人安装&#xff09; 双击其中的exe文件 点击下一步 选择中文 接受用户协议 下面这个弹窗有的没有。 建议勾选导入导出 安装目录&#xff0c…

单向循环链表与双向链表

单向循环链表的原理与应用 思考&#xff1a;对于单向链表而言&#xff0c;想要遍历链表&#xff0c;则必须从链表的首结点开始进行遍历&#xff0c;请问有没有更简单的方案实现链表中的数据的增删改查&#xff1f; 回答&#xff1a;是有的&#xff0c;可以使用单向循环的链表进…

Windows鼠标掉帧测试与修复

前言 这两天突然发现鼠标似乎有掉帧&#xff0c;但是掉的又不太明显&#xff0c;用着感觉似乎快速移动的时候会有一瞬间卡一下&#xff0c;但是眼睛又看不清楚&#xff0c;不太确定是不是自己的心理作用&#xff0c;非常难受。 如何判断鼠标是否掉帧 根据我的经验&#xff0…

U 盘数据恢复全攻略

目录 &#x1f4be; U盘数据误删怎么办&#xff1f;两款实用工具助你找回丢失文件&#xff01;1️⃣ Recover My Files&#xff1a;数据恢复的得力助手&#x1f4cc; 主要特点&#x1f6e0; 使用步骤详解1. 下载与安装2. 启动软件并选择恢复类型3. 选择U盘所在分区4. 选择文件恢…

HarmonyOS NEXT~鸿蒙系统运维:全面解析与最佳实践

HarmonyOS NEXT&#xff5e;鸿蒙系统运维&#xff1a;全面解析与最佳实践 摘要 本文深入探讨鸿蒙(HarmonyOS)系统的运维管理&#xff0c;从架构特点到日常维护操作&#xff0c;全面分析这一全场景分布式操作系统的运维要点。文章将介绍鸿蒙系统特有的分布式能力运维管理、性能…

基于 STM32 的智慧农业温室控制系统设计与实现

摘要 本文提出一种基于 STM32 微控制器的智慧农业温室控制系统设计方案,通过集成多类型环境传感器、执行机构及无线通信模块,实现对温室内温湿度、光照、土壤湿度等参数的实时监测与自动调控。文中详细阐述硬件选型、电路连接及软件实现流程,并附关键代码示例,为智慧农业领…

Appium+python自动化(五)- 模拟器

简介 Appium是做安卓自动化的一个比较流行的工具&#xff0c;对于想要学习该工具但是又局限于没 android 手机来说&#xff0c;可以通过安卓模拟器来解决该问题&#xff0c;下面就讲解使用appium连接安卓模拟器的操作步骤。而是由于手机数据线问题&#xff0c;也只好先用模拟器…

汽车充电桩专用ASCP210系列电气防火限流式保护器

1.概述汽车充电桩专用电气防火限流式保护器 电气防火限流式保护器可有效克服传统断路器、空气开关和监控设备存在的短路电流大、切断短路电流时间长、短路时产生的电弧火花大&#xff0c;以及使用寿命短等弊端&#xff0c;发生短路故障时&#xff0c;能以微秒级速度快速限制短…

Linux中磁盘分区与挂载

一、磁盘划分 1.1 了解磁盘 硬盘的接口类型 接口类型发展方向应用场景IDESATA I/II/III个人PC机SCSISAS服务器上 磁盘命名规则 OSIDE(并口)SATA(串口)SCSIRHEL5/dev/hda/dev/sda/dev/sdaRHEL6/dev/sda/dev/sda/dev/sdaRHEL7/dev/sda/dev/sda/dev/sda 1.2 磁盘划分 磁盘划…

【数据分析】什么是特征蒸馏?

引言 —— “ 在数据洪流中提炼真金——解密特征蒸馏的艺术。” 在数据爆炸的时代&#xff0c;我们每天产生的信息量已远超人类处理能力的极限。当企业拥有百万维的用户行为数据&#xff0c;医疗研究者面对TB级的基因测序记录&#xff0c;工程师试图从千万张图像中识别关键模式…

机器学习笔记【Week4】

一、 为什么要用神经网络&#xff1f; 逻辑回归只能处理线性可分问题。例如&#xff0c;经典的 XOR 异或问题无法用单层逻辑回归准确分类。神经网络通过多层结构和非线性激活函数&#xff0c;能学习复杂的决策边界&#xff0c;解决非线性问题。 二、神经网络的基本组成 神经网…

java交易所,多语言,外汇,黄金,区块链,dapp类型的,支持授权,划转,挖矿(源码下载)

目前这套主要是运营交易所类型的&#xff0c;授权的会贵点&#xff0c;编译后的是可以直接跑的&#xff0c;图片也修复了&#xff0c;后门也扫了 都是在跑的项目支持测&#xff0c;全开源 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/90887047 更多…

2025CCPC河北省赛题解

题目区分度不错&#xff0c;不过两题手快铜确实没想到。 Attention is all you need&#xff01; H - What is all you need? 签到题 #include <bits/stdc.h> #define x first #define y second #define int long long #define double long doubleusing namespace st…

【IOS】【OC】【应用内打印功能的实现】如何在APP内实现打印功能,连接本地打印机,把想要打印的界面打印成图片

【IOS】【OC】【应用内打印功能的实现】如何在APP内实现打印功能&#xff0c;连接本地打印机&#xff0c;打印想打印的界面 设备/引擎&#xff1a;Mac&#xff08;14.1.1&#xff09;/cocos 开发工具&#xff1a;Xcode 开发语言&#xff1a;OC/C 开发需求&#xff1a;工程中…

AWS WebRTC:获取信令服务节点和ICE服务节点

建立WebRTC的第一步是获取信令服务节点和ICE服务节点。 前提条件是有访问AWS的密钥&#xff0c;主要是ak&#xff0c;sk&#xff0c;token&#xff0c;我这边是业务云有接口可以返回这些信息&#xff0c;所以我直接从业务云获取。 先介绍一下什么是ak&#xff0c;sk&#xff…

C++23 新成员函数与字符串类型的改动

文章目录 引言std::basic_string::contains 与 std::basic_string_view::contains (P1679R3)功能介绍示例代码优势 禁止从 nullptr 构造 std::basic_string 和 std::basic_string_view (P2166R1)背景改动影响 std::basic_string_view 的显式范围构造函数 (P1989R2)功能介绍示例…