【发布时间】: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?这个谷歌示例有缺陷吗?那么正确的做法是什么?
【问题讨论】:
标签: android google-maps android-intent