当Fragment onActivityCreated调用时

时间:2019-11-06 20:09:42

标签: android android-fragments android-lifecycle

在使用Google体系结构组件和LiveData之前,我没有注意onActivityCreated()回调。 我在SOF和文档中也对此有所了解,但我仍然无法理解其行为。

来自SOF答案之一:

  

顾名思义,在Activity的onCreate()具有   完成。

  • onActivityCreated() 被称为的情况下以及何时onActivityCreated() 未被呼叫

  • 是否可能onCreateView()被调用而onActivityCreated()没有被调用?

LiveData中附加onActivityCreated()个观察者是常见的做法,所以我猜onActivityCreated()onCreateView()之间有很大的不同?

尽管从官方Android文档中查看该图似乎onActivityCreated()之后onCreateView()总是被称为总是(就执行而言,不是顺序),并且没有区别吗?

有些令人困惑的地方。

enter image description here

1 个答案:

答案 0 :(得分:2)

编辑: :根据Twitter上的Ian Lake(请参阅https://twitter.com/ianhlake/status/1193964829519667202),FragmentActivity试图分发onActivityCreated的事实在onStart中是无关紧要的,因为无论发生什么情况,FragmentManager都会在从onCreateonStart时将其分派。

            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();

所以我下面所说的实际上是错误的。

显然,在片段内使用onActivityCreated等效于使用onViewCreated

但这也意味着您不应该依靠onActivityCreated来了解您的Activity是否真正创建,因为它比实际创建Activity的次数要多。

片段令人困惑。



原始答案:

  

是否可以调用onCreateView()但不调用onActivityCreated()?

更新:否,不可能。

原始:是的,他们在FragmentPagerAdapter中使用FragmentTransaction.detach / FragmentTransaction.attach,这会导致视图被破坏,但片段仍然存在(已停止) ,但未销毁。)

在这种情况下,.attach()运行onCreateView,而不运行onActivityCreated

  

在onActivityCreated()中附加LiveData观察者是一种常见的做法,所以我猜onActivityCreated()和onCreateView()之间有显着差异?

更新:没关系,尽管onViewCreated仍然更清楚

原始:这实际上是 不良习惯 ,应在onViewCreated中完成,并提供getViewLifecycleOwner()作为生命周期所有者。

  

尽管从Android官方文档中查看该图似乎好像onActivityCreated()总是在onCreateView()之后调用,并且没有区别?

更新:尽管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进入。