IntentService 和 Activity 生命周期
Posted
技术标签:
【中文标题】IntentService 和 Activity 生命周期【英文标题】:IntentService and Activity Lifecycle 【发布时间】:2018-07-18 02:04:40 【问题描述】:我关注了this tutorial 如何在 android 中反向地理编码,但我不明白这个 IntentService
将如何很好地处理 Activity
生命周期。我正在关注this code sample。
据我了解,Activity
将包含一个名为 mResultReceiver
的 AddressResultReceiver
实例。当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 生命周期的主要内容,如果未能解决你的问题,请参考以下文章
Android 10:无法在 IntentService 中使用 openFileDescriptor