IntentService 和 Activity 生命周期

Posted

技术标签:

【中文标题】IntentService 和 Activity 生命周期【英文标题】:IntentService and Activity Lifecycle 【发布时间】:2018-07-18 02:04:40 【问题描述】:

我关注了this tutorial 如何在 android 中反向地理编码,但我不明白这个 IntentService 将如何很好地处理 Activity 生命周期。我正在关注this code sample。

据我了解,Activity 将包含一个名为 mResultReceiverAddressResultReceiver 实例。当IntentService 返回反向地理编码地址时,它将从mResultReceiver 实例调用mReceiver.send(resultCode, bundle),然后更新Activity 内的UI。

我的问题是这将如何与Activity 生命周期一起发挥作用。让我们假设Activity 启动了IntentService,然后,由于某种原因,它被破坏了(比如,用户旋转了屏幕)。后来,当IntentService从谷歌地图接收到地址时,它会调用它从原来的Activity接收到的mResultReceiver,它现在已经被销毁了(或者它可以被再次创建,但它仍然会无论如何都要成为一个新实例)。

由于mResultReceiver是在创建Activity时创建的,并且它没有保存在任何Bundle上以供以后检索,所以当IntentService完成并调用原始mResultReceiver时,会发生什么?

mResultReceiver 调用是否会自动转发到Activity 的新实例,就像没有发生任何事情一样,并且一切都按预期工作?

mResultReceiver 是否会与已销毁的 Activity 一起被垃圾收集,IntentService 在尝试使用已销毁的类时会抛出异常?

mResultReceiver 会阻止原始的Activity 被垃圾回收,特别是因为IntentService 仍然持有对mResultReceiver 对象的引用。而当IntentService 调用mReceiver.send(resultCode, bundle) 时,它不会对屏幕上的实际Activity 产生影响,还是会抛出异常以尝试更新已经破坏的UI Widget?

这个谷歌示例有缺陷吗?那么正确的做法是什么?

【问题讨论】:

【参考方案1】:

我相信谷歌的例子是有缺陷的。如果活动被破坏,样本将导致内存泄漏。更好的方法是使用本地广播接收器或事件总线或 RxJava/RxAndroidIssue is already reported here

【讨论】:

以上是关于IntentService 和 Activity 生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Service可以执行耗时操作吗

你能解释一下 IntentService 是如何工作的吗

Android 10:无法在 IntentService 中使用 openFileDescriptor

异步服务IntentService

Android IntentService全然解析 当Service遇到Handler

字节跳动Android面试凉凉