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

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

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

故事背景

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

代码故事

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

java 复制代码
/**
 * Base class for dialogs that should appear over panels and keyguard.
 */
public class SystemUIDialog extends AlertDialog {

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

代码1

java 复制代码
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的使用。

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

java 复制代码
    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

java 复制代码
			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

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

java 复制代码
		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压缩包里啥啥啥的。

相关推荐
踏雪羽翼2 小时前
android TextView实现文字字符不同方向显示
android·自定义view·textview方向·文字方向·textview文字显示方向·文字旋转·textview文字旋转
lxysbly3 小时前
安卓玩MRP冒泡游戏:模拟器下载与使用方法
android·游戏
夏沫琅琊5 小时前
Android 各类日志全面解析(含特点、分析方法、实战案例)
android
程序员JerrySUN5 小时前
OP-TEE + YOLOv8:从“加密权重”到“内存中解密并推理”的完整实战记录
android·java·开发语言·redis·yolo·架构
TeleostNaCl7 小时前
Android | 启用 TextView 跑马灯效果的方法
android·经验分享·android runtime
TheNextByte17 小时前
Android USB文件传输无法使用?5种解决方法
android
quanyechacsdn9 小时前
Android Studio创建库文件用jitpack构建后使用implementation方式引用
android·ide·kotlin·android studio·implementation·android 库文件·使用jitpack
程序员陆业聪9 小时前
聊聊2026年Android开发会是什么样
android
编程大师哥10 小时前
Android分层
android
极客小云11 小时前
【深入理解 Android 中的 build.gradle 文件】
android·安卓·安全架构·安全性测试