什么时候提交 FragmentTransaction 是安全的?

When is it safe to commit a FragmentTransaction?

根据 docs

A fragment transaction can only be created/committed prior to an activity saving its state. If you try to commit a transaction after Activity.onSaveInstanceState() (and prior to a following Activity.onStart or Activity.onResume(), you will get an error.

我可以理解,片段事务在Activity.onSaveInstanceState()之后不能提交的第一部分, 因为如果 activity 需要恢复,提交后的状态可能会丢失。

但我不明白为什么我们不能在 Activity.onStart 或 Activity.onResume() 之前提交片段事务? oncreate()也是先于Activity.onStart或Activity.onResume()。是不是说我们连oncreate()中commit都没有?

这里的关键是您不能在调用 onSaveInstanceState() 之后和以下 onStart() 或 [=12] 之前提交事务=].

您可以在初始 onCreate() 和后续 onStart()onResume() 上提交事务,因为没有状态。

但是,如果 Activity 正在恢复其状态(即之前调用了 onSaveInstanceState(),并且 Activity 正在使用该状态重新创建自身,则您无法执行片段事务。这是因为如果您在 Activity 恢复之前的 Fragment 状态之前提交 Fragment 事务,您最终会陷入不清楚您处于什么状态的情况。保存的状态是否优先于新状态您是通过提交片段事务创建的,还是新事务优先于保存的状态?

检查这种情况的最简单方法是检查传递给 onCreate() 和其他生命周期方法的 savedInstanceState 包是否为 null。如果它为空,则没有保存的状态,您可以安全地执行您的交易。如果它不为空,则可能存在您想要保留的已保存状态。

onSaveInstanceState()之前的任何时候都是安全的,这基本上意味着在onPause()/onResume()之前,如果你的Activity曾经去过[=12] =],那么只有在onResume().

之后才是安全的

例如,在 onActivityResult() 期间,您实际上并没有在 onResume() 之后访问过,因此在 onActivityResult() 中打开对话框可能会崩溃。

可能要记住 已提交 交易可能 已执行
这处理:

getSupportFragmentManager().executePendingTransactions();