【问题标题】:IntentService and Activity LifecycleIntentService 和 Activity 生命周期
【发布时间】: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?

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

【问题讨论】:

    标签: android google-maps android-intent


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-21
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 2015-05-13
      • 2013-07-10
      • 1970-01-01
      相关资源
      最近更新 更多