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

相关推荐
恋猫de小郭3 小时前
React Native 鸿蒙 2026 路线发布,为什么它的适配成本那么高?
android·前端·react native
studyForMokey3 小时前
【Android面试】窗口机制专题
android·面试·职场和发展
用户013201436034 小时前
Android 资源管理与常用布局详解|基础入门
android
陆业聪5 小时前
从 OpenClaw 到 Android:Harness Engineering 是怎么让 Agent 变得可用的
android·人工智能·ai编程
stevenzqzq7 小时前
颜色透明度转换技术文档(Android/Compose)
android
巴黎没有摩天轮Li7 小时前
Android JVMTI 接入流程
android
2501_915909068 小时前
iOS 抓包不越狱,代理抓包 和 数据线直连抓包两种实现方式
android·ios·小程序·https·uni-app·iphone·webview
城东米粉儿8 小时前
Android VCL 和 NAL笔记
android
常利兵8 小时前
从0到1,解锁Android WebView混合开发新姿势
android·华为·harmonyos
背包客(wyq)8 小时前
基于Android手机的语音数据采集系统(语音数据自动上传至电脑端)
android·网络