使用ResultReceiver如果活动被销毁并且意图服务仍在运行,会发生什么

时间:2016-07-30 12:17:48

标签: android intentservice

这个问题已经被问到here但是没有好的答案。

所以基本上我有一个在后台运行的意图服务来做一些事情,一旦完成,我使用resultreceiver将结果发送回活动,所以我需要知道的是:

  1. 如果在意图时销毁活动,我该如何处理这种情况 服务还在运行吗?
  2. 如何知道活动是否已从意向服务中销毁?
  3. 将结果发送回时,resultreciever会发生什么 活动已被销毁时的活动?这会产生错误吗?

1 个答案:

答案 0 :(得分:4)

这是一个迟到的答案,但我正在研究IntentService的功能,我遇到了你的问题。

  

如何在意图服务仍在运行时处理活动被破坏的情况?

由于IntentService是一个单独的组件,它将继续运行,直到指定给它的任务完成或运行应用程序的进程被销毁。最初的想法可能是在活动被销毁时停止IntentService。简单,不是吗?嗯,不太好。当你调用stopService(Intent)时,虽然调用onDestroy()的{​​{1}}方法,但后台线程将继续运行直到它完成并将结果传递给接收者。

  

如何知道活动是否被意图服务销毁?

这是一个很好的问题,我自己也想知道。这里描述了一个简洁的解决方案 - IntentService responding to dead ResultReceiver

  

当活动已经被销毁时,将结果发送回活动时,结果是什么?这会产生错误吗?

这很可能不会导致任何可见的异常,因为活动不可见。但是,当您对活动中定义的对象进行引用时,它可能会导致配置更改中的内存泄漏(只要线程继续运行,这将阻止活动被垃圾回收 - 请参阅IntentService prevents activity from destroying)。但上面提到的答案可以缓解这个问题,因为它会使IntentServiceResultReceiver的引用无效,从而避免任何潜在的内存问题

此外,值得一提的是,您可以考虑onDestroy的方法,通过注册/取消注册LocalBroadcastManager,可以更轻松地处理Activity的生命周期。可用示例here from the google samples repo