当前位置: 首页 > article >正文

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压缩包里啥啥啥的。


http://www.kler.cn/a/157345.html

相关文章:

  • 图片懒加载
  • C# cad启动自动加载启动插件、类库编译 多个dll合并为一个
  • 文件解析漏洞中间件(iis和Apache)
  • 关于使用拓扑排序算法实现解析勾稽关系优先级的研究和实现
  • 熟悉u8g2图形库C语言函数
  • 在ESP32使用AT指令集与服务器进行TCP/IP通信时,<link ID> 解释
  • Redis实战篇笔记(最终篇)
  • Java核心知识点整理大全18-笔记
  • 简单的界面与数据分离的架构
  • TensorRT-LLM保姆级教程(二)-离线环境搭建、模型量化及推理
  • 十二月四日多继承
  • 2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-C
  • 竞赛选题YOLOv7 目标检测网络解读
  • CSS实现瀑布流
  • MyBatis 设计模式解析
  • KaiwuDB 多模数据库-时序性能优化
  • 2023经典软件测试面试题
  • 面试题目总结(二)
  • 黑马一站制造数仓实战1
  • 【自用数据结构】—将链表中的奇数全部移动到偶数前面
  • 考研英语语法(四十)
  • <Linux>(极简关键、省时省力)《Linux操作系统原理分析之存储管理(2)》(15)
  • 高效学习 React 框架AntDesign Pro
  • 玩转大数据5:构建可扩展的大数据架构
  • MySQL数据备份
  • TCP三次握手与四次挥手:推荐学习资料、过程详解、面试相关题与回答模板(为什么不是两次握手等精讲)