记录一下花了三四天干一天就能完成的需求的傻事。
说在前头,这篇文章记录了电池提醒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压缩包里啥啥啥的。