能否在BroadcastReceiver里创建AlertDialog并显示?

  •  在对话框初始的时候,设置 

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关闭时对话框也会随着关闭)。

另外:
  1. 不要尝试在广播里显示对话框,因为不知道用户会什么时候关闭对话框,广播的生命周期很短,应该起个Service再去执行你需要的业务;
  2. 如果你当前没有Activity的实例,你可以用WindowManager创建全局的悬浮视图(对话框的底层也是基于这个创建视图);


作者:Kaede 君
链接:https://www.zhihu.com/question/37849134/answer/73840267
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。




  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值