Android 如何从Runnable中检测活动是否处于可用状态?

Android 如何从Runnable中检测活动是否处于可用状态?,android,service,android-activity,Android,Service,Android Activity,我有一个正在执行数据更新的服务。我有一个活动(通过本地绑定)将侦听器连接到服务。侦听器接收进度更新。在收到进度更新后,它会计划在UI线程上运行runnable。以下是代码(已更新以显示完整列表): 如果我在对话框显示时点击主页按钮,然后返回应用程序,我会在showDialog行中遇到崩溃。使用调试器,我能够确定活动处于完成状态 在我的runnable中放入什么合适的检查来确定调用showDialog是否安全?当活动暂停时(覆盖onPause),我会亲自关闭进度对话框,必要时在活动恢复时重新创建它

我有一个正在执行数据更新的服务。我有一个活动(通过本地绑定)将侦听器连接到服务。侦听器接收进度更新。在收到进度更新后,它会计划在UI线程上运行runnable。以下是代码(已更新以显示完整列表):

如果我在对话框显示时点击主页按钮,然后返回应用程序,我会在
showDialog
行中遇到崩溃。使用调试器,我能够确定活动处于完成状态


在我的runnable中放入什么合适的检查来确定调用
showDialog
是否安全?

当活动暂停时(覆盖
onPause
),我会亲自关闭进度对话框,必要时在活动恢复时重新创建它(覆盖
onResume
)。通过在其他单独的对象(对话框)中保留对活动的引用,可能会泄漏内存。

您应该在onPause方法中分离侦听器,以便由于活动进入后台,侦听器不会触发并尝试更新UI

我最终采用的解决方案是创建一个标记
taskServiceBound
,该标记在
onStart
中绑定到服务后设置为true,并在
onStop
中从服务解除绑定前设置为false。由于该标志在UI线程上更新,因此我可以使用它在
updateProgress
updateCompleted
中对可运行程序进行选通。例如:

  public void updateCompleted() {
    runOnUiThread(new Runnable() {
      public void run() {  
        if (taskServiceBound) {
          dismissDialog(UPDATE_DIALOG);
          startNextActivity();
        }
      }
    });
  }

如果您显示listener+服务代码,我们可能会给出更好的答案。我目前只在顶部的
onStop
中分离listener,因此我也会在
onPause
中进行分离。尽管如此,仍然有可能出现这样的事件交错:1。服务通知侦听器2。侦听器在UI 3中添加一个runnable以更新进度
onPause
分离侦听器4。runnable尝试在暂停的活动中显示对话框,但这肯定有助于查看您的服务如何与活动通信。今晚我将发布更完整的源代码。谢谢你的帮助。我已经添加了完整的代码清单。我发现在
onPause
中分离侦听器没有任何帮助,只是更早地出现了崩溃。我尝试添加一个在分离侦听器时切换的标志,并在Runnable中检查该标志,如果设置了,则提前退出。这很有效,但是如果活动已经有效地有了旗子,我想避免维护旗子。@Hilton你可以检查我对这个问题的回答。如果您使用本地IntentService,您可以真正简化代码。它还显示了如何在服务仍在运行时正确处理您的活动。
  public void updateCompleted() {
    runOnUiThread(new Runnable() {
      public void run() {  
        if (taskServiceBound) {
          dismissDialog(UPDATE_DIALOG);
          startNextActivity();
        }
      }
    });
  }