onResume() 和 onResumeFragments() 的区别

Posted

技术标签:

【中文标题】onResume() 和 onResumeFragments() 的区别【英文标题】:Difference between onResume() and onResumeFragments() 【发布时间】:2015-02-21 13:41:11 【问题描述】:

FragmentActivity.onResume() javadoc:

分派 onResume() 到片段。请注意,为了更好地与旧版本的平台互操作,在此调用时,附加到活动的片段不会恢复。这意味着在某些情况下,之前的状态可能仍然被保存,不允许修改状态的片段事务。要正确与处于正确状态的片段交互,您应该重写 onResumeFragments()。

FragmentActivity.onResumeFragments() javadoc:

这是 onResume() 的面向片段的版本,您可以覆盖它以在 Activity 中在其片段恢复的同一点执行操作。一定要一直打电话给超类。

以上是否意味着平台保证

片段永远不会在执行FragmentActivity.onResume()和时被恢复(它们的onResume()没有被调用) 片段总是在执行FragmentActivity.onResumeFragments()时会被恢复(他们的onResume()被调用)?

如果没有,开发者如何正确利用上述内容并保持警惕?

【问题讨论】:

我发现在保存实例状态后在onResume() 内执行片段事务会导致IllegalStateException: Can not perform this action after onSaveInstanceState while perform it inside @987654330 @没有。然后我注意到FragmentActivity.onResume() 的文档就是这么说的。 【参考方案1】:

onResume() 会被调用吗?

是的,FragmentActivity.onResume() 仍将被调用(与 Activity.onResume() 的上下文相同)。 即使您覆盖FragmentActivity.onResumeFragments()(来自FragmentActivity 的附加方法知道它包含Fragments)。

onResume()onResumeFragments() 有什么区别?

FragmentActivity.onResumeFragments()FragmentActivity 上的回调,用于当它包含的Fragments 正在恢复时,这与Activity 恢复时不同>.

这是 onResume() 的面向片段的版本,您可以覆盖它以在 Activity 中在其片段恢复的同一点执行操作。请务必始终致电超类。

何时使用哪种方法?

如果您使用的是 support-v4 库和 FragmentActivity,请尝试在您的 FragmentActivity 实现中始终使用 onResumeFragments() 而不是 onResume()

FragmentActivity#onResume() documentation:

要正确与处于正确状态的片段进行交互,您应该重写 onResumeFragments()。

差别很细微,见https://github.com/xxv/android-lifecycle/issues/8:

onResume() 应该用于普通的 Activity 和 onResumeFragments() 在使用 v4 兼容库时。 这仅在应用程序等待 FragmentManager 完成初始 FragmentTransaction 时才需要。

【讨论】:

从我在源代码中可以看到,onResume()FragmentActivity 中有一个覆盖,因此它与Activity 的版本不同。不过,我在FragmentActvity的源码中也注意到onResumeFragments()是从onPostResume()调用的,所以至少可以肯定它是在onResume()之后调用的。理想情况下,我会接受一个指定何时使用onResumeFragments() 而不是onResume() 的答案,或者确认我的假设。 你是对的。简单来说:如果您使用的是 support-v4 库,请尝试始终使用 onResumeFragments() 而不是 onResume()。差异很微妙,请参阅github.com/xxv/android-lifecycle/issues/8 谢谢。您能否更新答案(该链接特别有用),以便我接受?

以上是关于onResume() 和 onResumeFragments() 的区别的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 上的小部件的 onResume() 和 onPause()

requestLocationUpdates无限地回忆onPause和onResume

替换片段后未调用 OnDestroyView 和 OnResume

OnResume / OnPause多次调用

iOS 上的 Flutter FCM 不调用 onMessage 和 onResume

onResume 中的 NullPointerException