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

has*_*s19 6 android intentservice

这个问题已经在这里提出但是没有好的答案.

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

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

Abh*_*jit 4

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

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

由于它IntentService是一个单独的组件,因此它将继续运行,直到指定给它的任务完成或运行应用程序的进程被销毁。IntentService最初的想法可能是在活动被破坏时停止。很简单,不是吗?嗯,不完全是。事实证明,当您调用 时stopService(Intent),尽管调用了onDestroy()的方法IntentService,但后台线程将继续运行,直到完成并将结果传递给接收者。

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

这是一个很好的问题,也是我自己也想知道的问题。这里描述了一种简洁的解决方案 - IntentService 响应失效的 ResultReceiver

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

这很可能不会导致任何可见的异常,因为活动不可见。但它可能会导致配置更改时发生内存泄漏,因为您引用了活动中定义的对象(这将阻止活动在线程继续运行时被垃圾收集 - 请参阅IntentService 防止活动销毁)。ResultReceiver但是上面链接的答案应该可以缓解这个问题,因为它消除了in的引用onDestroy,避免了任何潜在的内存问题

另外,值得一提的是,您可以考虑 a 的方法,这使得通过注册/取消注册 .aLocalBroadcastManager的生命周期变得更容易。示例可从 google 示例存储库中获取ActivityBroadcastReceiver