【发布时间】:2014-02-26 20:10:32
【问题描述】:
因此,我正在研究将回调接口更改为本地广播以进行一些长期运行的网络操作的可行性。由于 Activity 生命周期为需要修改 UI 的异步请求创建了各种复杂性(断开 Activity 与 onDestroy() 中的回调,不要在 onSaveInstanceState() 之后修改 FragmentTransactions 等),我认为使用本地广播更有意义,我们可以在生命周期事件中注册/注销接收器。
但是,当 Activity 在配置更改期间被销毁并重新创建时,广播接收器将不会被注册(例如在 onPause()/onResume() 之间)。因此,例如,如果我们在onCreate() 中启动异步请求,如果savedInstanceState == null(例如对于第一次启动Activity),如果用户在完成时发送的广播是否可能会丢失?在操作完成之前改变他们的设备方向?(即接收器在 onPause() 上取消注册,然后操作完成,然后在 onResume() 中重新注册接收器)
如果是这样,那么它会增加很多额外的复杂性,我们需要添加对它的支持,而且可能不值得切换。我已经研究过其他东西,例如 Otto EventBus 库,但我不确定它是否有同样的问题需要担心。
【问题讨论】:
-
Android 会在 Activity 重新启动时禁用主线程中的消息队列处理,因此应始终在您在
Activity生命周期启动回调之一中为其注册后发送广播。 -
这听起来很有趣,我认为可能会发生类似的事情,但你有这方面的消息来源吗?
-
见 Dianne Hackborn 的 comment。这也记录在
ActivityonRetainNonConfigurationInstance()方法中。 -
@corsair992 谢谢!这是非常有用的信息。不幸的是,
onRetainNonConfigurationInstance()现在已弃用,取而代之的是 FragmentsetRetainInstance(),所以我可能会在该组上发帖,看看是否有对 Fragment 生命周期的等效保证。如果您想发布此信息作为答案,我会接受。 :) -
由于
Fragment生命周期由Activity管理,我认为它在这方面没有任何不同的语义:)
标签: android android-lifecycle localbroadcastmanager