【问题标题】:onDestroy of a service is never called永远不会调用服务的 onDestroy
【发布时间】:2014-09-26 19:54:48
【问题描述】:

我在我的 MainActivity 中添加了一个本地服务,在 onResume 中,我这样做了

@Override
public void onResume() {
    super.onResume()
    boolean is_start = isMyServiceRunning(MyService.class)
    if (is_start) {
        bindMyService()
    } else {
        startMyService()
        bindMyService()
    }
}

在 onPause 中,我只是简单地执行“unBindMyService”操作。

另外,我添加了 Context.BIND_AUTO_CREATE 标志来绑定服务,结果很奇怪。

  1. 用logcat可以看到MyService的“onCreate”和“onBind”,很顺利
  2. 当我切换到另一个活动或应用程序时,会调用“Unbind”,这是正确的!
  3. 当我在设置中“强制停止”服务时,会调用服务的“onDestroy”作为响应,没关系。
  4. 当我从应用程序的“最近列表”中删除应用程序时,没有调用Service的“onDestroy”,我可以解释为服务没有终止。也可以。
  5. 我无法解释的是,在 4 之后,我再次启动我的应用程序,我注意到服务的“onCreate”和“onBind”被调用,但没有一个服务的“onDestroy”。即使“is_start”为真,服务也会在没有调用“onDestroy”的情况下重新创建。

那么 4 到 5 之间发生了什么?服务还活着还是死了?

【问题讨论】:

  • 发布更多代码。 isMyServiceRunning、startMyService 和 bindMyService 方法有什么?
  • smallzhan...我已经执行了所有在役案件...我发现了几件事。我想说的是,一旦执行了 stopservice(),就可以调用 ondestroy in service。
  • 可能 5 发生在与 4 不同的进程中,这可能在没有警告的情况下被杀死 - 检查日志中 () 中的进程 ID。
  • @ChrisStratton 我用 logcat 检查了进程 id,发现服务实例的第二个 'onCreate' 和 'onBind' 的 pid 与原来的确实不同。你的意思是当新的服务启动时原来的服务被杀死而不是'onDestroy'?
  • 当你从最近刷出它时它被杀死了。然后,它可能会在不久后的某个时间点或很久以后或当用户启动的 Activity 需要它时在新流程中重新创建。

标签: android service


【解决方案1】:

您需要停止服务才能调用 onDestroy。 使用这个:

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    stopService(new Intent(this,MyService.class));
}

【讨论】:

  • 是的,我知道使用“startService”和“bindService”启动的服务,我必须使用“unBind”和“stopService”来销毁它。我认为该服务是“ALIVE”而没有调用“stopService”,我可以稍后在我的应用程序中绑定到它,但是在我的问题描述的“5”中发生的是,即使服务是“ALIVE”,当'从MainActivity调用bind',重新创建服务,很奇怪。
猜你喜欢
  • 2011-11-06
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-01
  • 1970-01-01
  • 2011-12-03
相关资源
最近更新 更多