关于Fragment的恢复与创建

2018-12-13  本文已影响2人  flyrun1

直接把手机的 不保留后台进程功能打开,然后再调试模式运行app 显示一个Fragment,直接按home键,点击app图标再次打开App。

同时断点在Activity的onCreate方法上,不断往里走,直到FragmentActivity的onCreate方法里,可以看到下面

               if (savedInstanceState != null) {
            Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
            mFragments.restoreAllState(p, nc != null ? nc.fragments : null);

继续看mFragments.restoreAllState,依次看到以下代码段

                mInstance = container.instantiate(context, mClassName, mArguments);
            } else {
                mInstance = Fragment.instantiate(context, mClassName, mArguments);
            }
            Class<?> clazz = sClassMap.get(fname);
            if (clazz == null) {
                // Class not found in the cache, see if it's real, and try to add it
                clazz = context.getClassLoader().loadClass(fname);
                sClassMap.put(fname, clazz);
            }
            Fragment f = (Fragment) clazz.getConstructor().newInstance();
            if (args != null) {
                args.setClassLoader(f.getClass().getClassLoader());
                f.setArguments(args);
            }
            return f;
        } catch (ClassNotFoundException e) {

最终把需要恢复的Fragment通过无参数构造方法实例化,装到FragmentManager的mActive中去,接着装入到mAdded中。这里可以知道在Activity恢复时会走onCreate方法,并且在这个方法里把需要恢复的Fragment创建出来放在Fragmentmanager实体类中。

然后把断点打在Fragment的onViewCreated方法中,通过调用栈可以看到

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

Fragment的onViewCreated方法是在FragmentActivity的onStart里的super.onStart()之后调用的。

上一篇下一篇

猜你喜欢

热点阅读