美文网首页
关于Fragment的恢复与创建

关于Fragment的恢复与创建

作者: flyrun1 | 来源:发表于2018-12-13 17:48 被阅读2次

    直接把手机的 不保留后台进程功能打开,然后再调试模式运行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()之后调用的。

    相关文章

      网友评论

          本文标题:关于Fragment的恢复与创建

          本文链接:https://www.haomeiwen.com/subject/esvbhqtx.html