我有一个在启动完成后激活的broadcastReceiver。原因是我想在设备重启后重新安排所有警报。但是,我想显示一个对话框,询问用户是否要继续。这是代码
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,但它会失败并显示对话框
除非我的理论错了,否则我错过了一个重点。请帮助,谢谢答案 0 :(得分:2)
您必须启动一个活动(具有透明背景),然后将对话框放在onCreate函数上。关闭对话框时关闭你的活动。
答案 1 :(得分:1)
无需以透明背景开始新活动。我知道解决方案是干净的,没有启动活动。 添加此附加代码行
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
并在清单文件中添加以下权限。
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
就是这样,现在AlertDialog可以在BroadcastReceiver中运行而不会出现任何错误。如果您不理解,请访问this link获取完整教程...
答案 2 :(得分:0)
你的理论很好,你只能通过一个Activity创建一个AlertDialog。 我认为您应该从广播接收器(startActivity)调用活动,然后此活动将显示此对话框。