私のアプリの最初のアクティビティは、その onStart() メソッドで IntentService に Intent を送信します。サービスの呼び出しに使用する Intent に ResultReceiver (匿名内部クラス) を配置します。次に、サービスは ResultReceiver を使用してデータベースを呼び出し元に渡します。
アプリを起動し、サービス呼び出しがまだ実行されている間に、すぐに「戻る」ボタンを押してホーム画面に戻る場合を除いて、これは正常に機能しているようです。サービス アクションが完了するとすぐに結果が ResultReceiver に送信され、その onReceiveResult() メソッドが進行状況ダイアログを (MyActivity.this をコンテキストとして使用して) 作成し、別の処理に進みます。
進行状況ダイアログを作成しようとすると、アクティビティが既に終了しているため、例外が生成されます。
06-23 23:29:14.114: E/AndroidRuntime(29570): FATAL EXCEPTION: main
06-23 23:29:14.114: E/AndroidRuntime(29570): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@4051bf80 is not valid; is your activity running?
06-23 23:29:14.114: E/AndroidRuntime(29570): at android.view.ViewRoot.setView(ViewRoot.java:557)
06-23 23:29:14.114: E/AndroidRuntime(29570): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
06-23 23:29:14.114: E/AndroidRuntime(29570): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
06-23 23:29:14.114: E/AndroidRuntime(29570): at android.view.Window$LocalWindowManager.addView(Window.java:433)
06-23 23:29:14.114: E/AndroidRuntime(29570): at android.app.Dialog.show(Dialog.java:265)
06-23 23:29:14.114: E/AndroidRuntime(29570): at android.app.ProgressDialog.show(ProgressDialog.java:107)
06-23 23:29:14.114: E/AndroidRuntime(29570): at android.app.ProgressDialog.show(ProgressDialog.java:90)
06-23 23:29:14.114: E/AndroidRuntime(29570): at android.app.ProgressDialog.show(ProgressDialog.java:85)
06-23 23:29:14.114: E/AndroidRuntime(29570): at com.myapp.SplashScreen.someMethod(SplashScreen.java:137)
それでは、上記を回避するためにこの種のことを行う適切な方法は何ですか?
ダイアログを表示する前に、すべてのコールバック内でアクティビティがまだ実行されているかどうかを確認する必要があるのは、非常に面倒です。それだけで、私はこれを間違った方法で行っているのではないかと疑います。
追加するために編集:
これは実際には、アプリを起動し、すぐに閉じて ([戻る] ボタンを使用してホーム画面に)、すぐにもう一度起動した場合にのみ発生するようです。起動して戻るボタンを押してから数秒間座っていると、例外は発生しません。