Android onReceive内部的对话框引发异常:无法添加窗口--标记null不为空

Android onReceive内部的对话框引发异常:无法添加窗口--标记null不为空,android,broadcastreceiver,android-dialog,Android,Broadcastreceiver,Android Dialog,我有一个启动完成后激活的广播接收器。原因是我想在设备重启后重新安排所有警报。但是,我想显示一个对话框,询问用户是否要继续。这是密码 public class StartupAlarmReceiver extends BroadcastReceiver{ Context con; @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().

我有一个启动完成后激活的广播接收器。原因是我想在设备重启后重新安排所有警报。但是,我想显示一个对话框,询问用户是否要继续。这是密码

public class StartupAlarmReceiver extends BroadcastReceiver{

    Context con;
    @Override
    public void onReceive(Context context, Intent intent) {

        if(intent.getAction().equals("android.intent.action.BOOT_COMPLETED"))
        {
            con = context;
            AlertDialog.Builder actionBuilder = new AlertDialog.Builder(context);
            actionBuilder.setTitle("test");
            actionBuilder.setMessage("Do you want to restart alarms?"); 
            actionBuilder.setCancelable(false);
            actionBuilder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                   new MyAsyncTask().execute();
                }
            })
            .setNegativeButton("No" , new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                   dialog.cancel();
                }
            });
            AlertDialog alert = actionBuilder.create();

            alert.show();

        }
}       

}
但是我得到了一个例外:

11-25 18:51:31.906: E/AndroidRuntime(1949): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
11-25 18:51:31.906: E/AndroidRuntime(1949):     at android.view.ViewRootImpl.setView(ViewRootImpl.java:693)
11-25 18:51:31.906: E/AndroidRuntime(1949):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:313)
11-25 18:51:31.906: E/AndroidRuntime(1949):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
我想我知道原因,但我不知道如何解决它。我认为(通过阅读SO)的原因是对话框需要一个活动,这样它才能显示出来,因为我不在我的应用程序中,所以我没有活动。那么,有没有一种方法可以在重启后显示对话框?我可以举杯祝酒,但在对话中失败了


除非我的理论是错误的,我遗漏了一个要点。请提供帮助,谢谢

您必须启动一个活动(背景透明),然后将对话框置于onCreate函数上。而不是在对话框关闭时关闭活动。

您的理论很好,您只能通过活动创建AlertDialog。
我认为您应该从广播接收器调用活动(startActivity),然后此活动将显示此对话框。

无需使用透明背景启动新活动。我知道没有开始活动的清洁溶液。 添加此附加代码行

alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
并在清单文件中添加以下权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />


就是这样,现在AlertDialog将在BroadcastReceiver中正常工作,不会出现任何错误。如果您不了解……请访问获取完整教程。

是否没有其他解决方案?但是谢谢你做的这件透明的事情。我知道没有其他的解决办法。。。您还可以使用对话框主题启动活动。但是你必须开始一项活动。谢谢,这更好地回答了这个问题