Android Framework 电池提醒相关Dialog熄屏消失的问题

记录一下花了三四天干一天就能完成的需求的傻事。

说在前头,这篇文章记录了电池提醒dialog相关,弹出dialog且熄屏再亮屏dialog不会消失的代码,这篇废话比较多,看正常代码直接跳到代码3。

故事背景

        需求要求添加非法电池的弹窗,我想着,区区dialog不是问题,于是我找找找找到了检测电池状态的地方,添加了非法电池相关判断,开始编译SystemUI安装。

代码故事

        在讲代码故事之前接受一下我用到的dialog,一个是AlertDialog,一个是SystemUIDialog,AlertDialog就是常用的弹窗,这个大家应该挺熟悉的,下面讲讲SystemUIDialog

/**
 * Base class for dialogs that should appear over panels and keyguard.
 */
public class SystemUIDialog extends AlertDialog {

        好了,对于SystemUIDialog我知道的就这么多,它继承自AlertDialog。

代码1

AlertDialog dialog = new AlertDialog.Builder(mContext)
				.setTitle("电池老化")
				.setMessage("电池老化,请及时替换电池")
				.setPositiveButton("确认",null)
				.create();
		//dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
		//dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM|WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
		dialog.setCanceledOnTouchOutside(false);
		dialog.show();

设备黑屏了。

报错了:

报错分析,没有activity或者activity没生成。

看到这个报错我也不知道怎么搞, mContext也不能getActivity,但是我很快就看到了源码里SystemUIDialog的使用。

像下面这个温度提醒的代码

    private void showThermalShutdownDialog() {
        if (mThermalShutdownDialog != null) return;
        final SystemUIDialog d = new SystemUIDialog(mContext);
        d.setIconAttribute(android.R.attr.alertDialogIcon);
        d.setTitle(R.string.thermal_shutdown_title);
        d.setMessage(R.string.thermal_shutdown_dialog_message);
        d.setPositiveButton(com.android.internal.R.string.ok, null);
        d.setShowForAllUsers(true);
        d.setOnDismissListener(dialog -> mThermalShutdownDialog = null);
        d.show();
        mThermalShutdownDialog = d;
    }

它用的也是mContext,而且能正常弹出,本着源码都是值得学习的心态,我马上模仿了一波,用了SystemUIDialog,也就造就了我的代码2.

代码2

			systemUIDialog = new SystemUIDialog(mContext);
			systemUIDialog.setTitle(R.string.dream_battery_aging_dialog_title);
			systemUIDialog.setMessage(R.string.dream_battery_aging_dialog_message);
			systemUIDialog.setPositiveButton(com.android.internal.R.string.ok, null);
			systemUIDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
			systemUIDialog.setShowForAllUsers(true);
			systemUIDialog.setCanceledOnTouchOutside(false);
            systemUIDialog.show();

没问题正常弹出,没黑屏没报错。

了却了一个需求轻松了,然后我就放着设备,它正常到点熄屏了,这时我想打开再看一眼我的劳动成果,dialog不见了!!!!我还没点确认dialog怎么就消失了,万一用户看不到呢。

我猜测难道SystemUIDialog挂的是window,黑屏window就销毁了,它也跟着销毁了??

然后就是各种试,想让它熄屏后再亮屏dialog也还在,没成功就是了,最后靠导师指导,成就了代码3

代码3

好消息,这是成功滴。不黑屏,熄屏再开也还在。

		AlertDialog dialog = new AlertDialog.Builder(mContext)
				.setTitle("dd")
				.setMessage("fhjk")
				.setPositiveButton("quer",null)
				.create();
		dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
		dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM|WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
		dialog.setCanceledOnTouchOutside(false);
		dialog.show();

错误尝试

过程中用了DialogFragment,没有Activity,不行。

用了Activity,让它的theme属性为android:theme="@android:style/Theme.Dialog

然后使用intent隐形跳转,不行,报错,这个activity不在SystemUI.apk压缩包里啥啥啥的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最强AI之风袭来,你爱了吗?

2017年,柯洁同阿尔法狗人机大战,AlphaGo以3比0大获全胜,一代英才泪洒当场...... 2019年,换脸哥视频“杨幂换朱茵”轰动全网,时至今日AI换脸仍热度只增不减; 2022年,ChatGPT一经发布便轰动全球&a…

【自然语言处理】利用sklearn库函数绘制三维瑞士卷

一,原理介绍 sklearn.datasets.make_swiss_roll()函数提供了三维瑞士卷的数据集,我们可以利用他来生成瑞士卷,该函数的用法见sklearn官方文档:官网文档:sklearn.datasets.make_swiss_roll&…

【VTKWidgetRepresentation】第二期 vtkHandleRepresentation

很高兴在雪易的CSDN遇见你 ,给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文系统分享vtkHandleRepresentation及其子类,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞关注,小易会继续努力分享,一起进步&am…

SpringBoot——嵌入式 Servlet容器

一、如何定制和修改Servlet容器的相关配置 前言: SpringBoot在Web环境下,默认使用的是Tomact作为嵌入式的Servlet容器; 【1】修改和server相关的配置(ServerProperties实现了EmbeddedServletContainerCustomizer)例如…

Unity Meta Quest 一体机开发(九):【手势追踪】通过录制抓取手势实现自定义抓取姿势

文章目录 📕教程说明📕录制前的准备📕第一种录制方法(Hand Grab Pose Tool 场景)⭐在运行模式中确认录制⭐保存录制的手势,将物体做成 Prefab⭐在编辑阶段调整抓取手势🔍Fingers Freedom&#x…

Redis部署-哨兵模式

目录 redis sentinel相关名词 redis sentinel架构 故障转移流程 基于docker搭建redis哨兵 准备工作 搭建过程 模拟主节点宕机,观察哨兵节点的工作流程 哨兵重新选取主节点的流程 1.主观下线 2.客观下线 3.哨兵节点推举出一个leader节点 4.leader选举完毕,leader挑选…

10、pytest通过assert进行断言

官方实例 # content of test_assert1.pydef f():return 3def test_function():assert f() 4def test_assert_desc():a f()# assert a % 2 0assert a % 2 0, "value was odd, should be even"解读与实操 pytest允许你使用标准python断言来验证测试中的期望和值&…

2661. 找出叠涂元素 : 常规哈希表运用题

题目描述 这是 LeetCode 上的 「2661. 找出叠涂元素」 ,难度为 「中等」。 Tag : 「模拟」、「哈希表」、「计数」 给你一个下标从 开始的整数数组 arr 和一个 的整数矩阵 mat。 arr 和 mat 都包含范围 , 内的所有整数。 从下标 开始遍历 arr 中的每…

电子取证--windows下的volatility分析与讲解

1.volatility的安装 提示:我用的是2.6版本(windows),如果直接下载的出现问题,用迅雷就可以解决 下载地址:Volatility 2.volatility的使用 1.进入终端,查看镜像的系统信息: volati…

鸿蒙4.0开发笔记之ArkTS装饰器语法基础之发布者订阅者模式@Provide和@Consume(十三)

1、定义 在鸿蒙系统的官方语言ArkTS中,有一套类似于发布者和订阅的模式,使用Provide、Consume两个装饰器来实现。 Provide、Consume:Provide/Consume装饰的变量用于跨组件层级(多层组件)同步状态变量,可以…

C#网络编程UDP程序设计(UdpClient类)

目录 一、UdpClient类 二、示例 1.源码 (1)Client (2)Server 2.生成 (1)先启动服务器,发送广播信息 (2)再开启客户端接听 UDP是user datagram protocol的简称&a…

【risc-v】易灵思efinix FPGA riscv嵌入式软件源码分享

系列文章目录 分享一些fpga内使用riscv软核的经验,共大家参考。后续内容比较多,会做成一个系列。 本系列会覆盖以下FPGA厂商 易灵思 efinix 赛灵思 xilinx 阿尔特拉 Altera 本文内容隶属于【易灵思efinix】系列。 【risc-v】易灵思efinix FPGA sap…

Python高效编程:十招实用技巧大揭秘!

更多资料获取 📚 个人网站:ipengtao.com 1. 代码优化与高效数据结构 Python中使用合适的数据结构对于代码性能至关重要。例如,使用字典(dict)快速查找元素: # 使用字典进行快速查找 sample_dict {a: 1,…

springboot引用插件jhipster的yml配置跨域问题

yml文件配置,下面这下有问题 jhipster:cors:allowed-origins: http://localhost:8091,http://localhost,http://172.16.67.161:7171,http://116.204.122.21:9670,http://172.16.15.55:6600,http://localhost:9000allow-credentials: trueallowed-methods默认值只有…

Unity 关于SetParent方法的使用情况

在设置子物体的父物体时,我们使用SetParent再常见不过了。 但是通常我们只是使用其中一个语法: public void SetParent(Transform parent);使用改方法子对象会保持原来位置,跟使用以下方法效果一样: public Transform tran; ga…

关于铝镓氮(AlGaN)上p-GaN的高选择性、低损伤蚀刻

引言 GaN基高电子迁移率晶体管(HEMT)由于其高频和低导通电阻的特性,近来在功率开关应用中引起了广泛关注。二维电子气(2DEG)是由AlGaN/GaN异质结中强烈的自发和压电极化效应引起的,这导致传统器件通常处于…

HarmonyOS引入其他包,以引入请求axios为例

安装文件 安装文件位置: 总目录的oh-package.json5文件 dependencies:生产环境–上线运行时候必须需要的包 devDependencies:开发环境–开发适合为了方便提高效率的包。 包管理工具 OHPM CLI 作为鸿蒙生态三方库的包管理工具,支持OpenHar…

OpenLayers入门,OpenLayers的Popup弹出框如何内嵌Vue组件内容和内嵌iframe网页,根据所点击要素动态切换弹框内容

专栏目录: OpenLayers入门教程汇总目录 前言 本章主要讲解OpenLayers弹出框如何与VUE组件联动,在Popup弹出框内容中嵌入vue的组件,以及iframe第三方网页和html元素等内容。 本章支持根据所点击要素动态切换弹框内容。 二、依赖和使用 "ol": "^6.15.1&qu…

VMware安装Ubuntu系统(Server端,Desktop端步骤一样)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

接口压测指南

接口压测指南 一、 为什么需要进行接口压测二 、接口压测的目标是什么三、 用什么工具进行接口压测四、 接口压测核心指标4.1 JMeter的报告模板4.2 ApiPost报告模板 五、 接口慢如何排查5.1 大体排查思路5.2 排查工具5.3 压测经验 一、 为什么需要进行接口压测 突然有一天领导…