- 在对话框初始的时候,设置
mProgressDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
可以让对话框始终显示在其他应用程序的window之上,也就是说这个dialog始终处于最上层,对用户始终可见,也就是说用户按了home之后dialog还在。
但是某些手机对底层进行了修改(小米,魅族之类),系统会默认会拒绝该权限。
通过将type设定为TYPE_TOAST, 就可以绕过检查
- 在dialog调用show()之前设置TYPE_TOAST属性而不是 TYPE_SYSTEM_ALERT属性,然后添加相同权限,<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
就不崩溃并且可以弹出全局dialog(手机三星SM-A9100)
public class BootCompleteReceiver extends BroadcastReceiver {
private static final String TAG = "BootCompleteReceiver";
@Override
public void onReceive(Context context, Intent intent) {
// Toast.makeText(context, "Boot complete", Toast.LENGTH_SHORT).show();
//不允许开线程 耗时操作
//就为了打开程序某个组件 例如创建 通知栏提醒 或启动一个服务
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("提示");
builder.setMessage("强制下线");
builder.setCancelable(false);
builder.setPositiveButton("ok", null);
AlertDialog dialog = builder.create();
// dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); //无效 崩溃
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST); //有效
dialog.show();
}
}
<uses-permission
android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
主要看你创建AlertDialog的Context实例是不是Activity,只有Activity的Context才能创建AlertDialog对话框(也可是说对话框需要绑定一个Activity实例,当Activity关闭时对话框也会随着关闭)。
另外:- 不要尝试在广播里显示对话框,因为不知道用户会什么时候关闭对话框,广播的生命周期很短,应该起个Service再去执行你需要的业务;
- 如果你当前没有Activity的实例,你可以用WindowManager创建全局的悬浮视图(对话框的底层也是基于这个创建视图);
作者:Kaede 君
链接:https://www.zhihu.com/question/37849134/answer/73840267
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。