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