1

起動が完了するとアクティブになる 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を読んでから)その理由は、ダイアログが表示できるようにアクティビティを取り、アプリ内にいないため、アクティビティがないためだと思います。再起動後にダイアログを表示する方法はありますか? トーストを表示できますが、ダイアログで失敗します

私の理論が間違っていて、要点を完全に見逃していない限り。助けてください、ありがとう

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 に答える