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

相关推荐
七月.末1 小时前
安卓aab包的安装教程,附带adb环境的配置
android·adb
SRC_BLUE_176 小时前
SQLI LABS | Less-39 GET-Stacked Query Injection-Intiger Based
android·网络安全·adb·less
无尽的大道9 小时前
Android打包流程图
android
镭封11 小时前
android studio 配置过程
android·ide·android studio
夜雨星辰48711 小时前
Android Studio 学习——整体框架和概念
android·学习·android studio
邹阿涛涛涛涛涛涛11 小时前
月之暗面招 Android 开发,大家快来投简历呀
android·人工智能·aigc
IAM四十二11 小时前
Jetpack Compose State 你用对了吗?
android·android jetpack·composer
奶茶喵喵叫12 小时前
Android开发中的隐藏控件技巧
android
Winston Wood13 小时前
Android中Activity启动的模式
android
众乐认证14 小时前
Android Auto 不再用于旧手机
android·google·智能手机·android auto