编辑: 根据 Twitter 上的 Ian Lake(参见 https://twitter.com/ianhlake/status/1193964829519667202),FragmentActivity 尝试在 onStart 中发送 onActivityCreated 的事实无关紧要,因为无论发生什么,FragmentManager 在从onCreate 到onStart 时都会调度它。
case Fragment.CREATED:
// We want to unconditionally run this anytime we do a moveToState that
// moves the Fragment above INITIALIZING, including cases such as when
// we move from CREATED => CREATED as part of the case fall through above.
if (newState > Fragment.INITIALIZING) {
fragmentStateManager.ensureInflatedView();
}
if (newState > Fragment.CREATED) {
fragmentStateManager.createView(mContainer);
fragmentStateManager.activityCreated(); // <--
fragmentStateManager.restoreViewState();
所以我下面说的其实是错的。
显然在 Fragment 中使用onActivityCreated 等同于使用onViewCreated。
但这也意味着你不应该依赖onActivityCreated 来知道你的Activity 是否被实际创建,因为它被调用的次数比实际创建Activity 的时间要多。
片段令人困惑。
原始答案:
是否有可能 onCreateView() 被调用但 onActivityCreated() 没有被调用?
更新:不,这是不可能的。
原文:是的,在FragmentPagerAdapter 中,他们使用FragmentTransaction.detach / FragmentTransaction.attach,这会导致视图被销毁,但片段仍然存在(停止,但未销毁)。
在这种情况下,.attach() 运行 onCreateView,但不是 onActivityCreated。
通常的做法是在 onActivityCreated() 中附加 LiveData 观察者,所以我猜 onActivityCreated() 和 onCreateView() 之间存在显着差异?
更新:没关系,尽管onViewCreated 仍然更清晰。
原文:这实际上是一种不好的做法,应该在onViewCreated 中完成,提供getViewLifecycleOwner() 作为生命周期所有者。
虽然从官方 Android 文档中查看图表似乎总是在 onCreateView() 之后调用 onActivityCreated() 并且没有差异?
更新:尽管FragmentActivity 只尝试调度一次,但所有 Fragment 始终通过 onActivityCreated,因为这正是 FragmentManager 的工作方式。
原文:它并不总是在onCreateView之后调用,实际上,它更像是所谓的“在onStart之前,但只有一次”。
/**
* Dispatch onStart() to all fragments.
*/
@Override
protected void onStart() {
super.onStart();
mStopped = false;
if (!mCreated) {
mCreated = true;
mFragments.dispatchActivityCreated(); // <---
}
mFragments.noteStateNotSaved();
mFragments.execPendingActions();
// NOTE: HC onStart goes here.
mFragments.dispatchStart();
}
更新: 但显然这对 FragmentManager 来说并不重要,因为无论哪种方式,它都会以CREATED -> ACTIVITY_CREATED -> STARTED 运行。