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