我的应用程序的初始活动在其onStart()方法中将Intent发送到IntentService。它将ResultReceiver(匿名内部类)放在它用于调用服务的Intent中。然后,该服务使用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)
那么:为了避免上述情况,做这种事情的正确方法是什么?
在显示对话框之前,必须检查活动是否仍在每个回调中运行,这似乎非常麻烦。仅这一点让我怀疑我是以错误的方式走了这条路。
编辑添加:
这实际上似乎只是在我启动我的应用程序时,快速关闭它(通过后退按钮到主屏幕),然后再次快速启动它。如果我只是启动它并按下后退按钮然后在那里坐几秒钟我就永远不会得到例外。