1

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

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 中阅读)原因是对话框需要一个活动,因此可以显示它,并且由于我不在我的应用程序中,所以我没有活动。那么有没有办法在重启后显示对话框?我可以显示 Toast,但对话框失败

除非我的理论是错误的并且我错过了一个重点。请帮忙,谢谢

4

3 回答 3

2

您必须启动一个活动(具有透明背景),然后将您的对话框放在 onCreate 函数上。比关闭对话框时关闭您的活动。

于 2012-11-26T00:09:45.587 回答
1

无需启动具有透明背景的新活动。我知道没有开始活动就干净的解决方案。添加这行额外的代码

alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

并在您的清单文件中添加以下权限。

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

就是这样,现在 AlertDialog 将在 BroadcastReceiver 中正常工作而不会出现任何错误。如果您不明白,请访问此链接以获取完整教程...

于 2015-01-07T14:43:05.273 回答
0

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

于 2012-11-26T00:10:35.047 回答