Fragment相关源码解析一——FragmentManagerImpl和BackStackRecord

原来一直只是使用Fragment,除了对一些常用API很熟悉外,对Fragment的内部原理还是不清楚,索性花了几天的时间,去阅读了Fragment相关的源码,从整体上对Fragment的框架有了一定深度的认识。当然,Fragment相关的类很多,Fragment内部的成员也很多,我目前还无法弄清楚Fragment的每一个细节,但整体上的正确认识有助于我们对细节的把握,也能对问题的查找、定位以及解决起到指导作用。这篇文章我准备先从Fragment被添加到Activity中的过程入手,观察一些相关的类和调用流程,然后针对一些具体的问题,在源码中找到解释做出总结。

FragmentActivity、HostCallbacks和FragmentController

从我们平常使用的动态添加Fragment说起,看一下其中是哪些类在起作用。

MyFragment f = new MyFragment();
getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.content, f)
                .commit();

其中getSupportFragmentManager()方法返回了一个FragmentManager对象。

先来看看mFragments这个成员,它是一个FragmentController对象。创建的时候还传入了一个继承FragmentHostCallback类的HostCallbacks对象。

    //FragmentActivity.java
    public FragmentManager getSupportFragmentManager() {
        return mFragments.getSupportFragmentManager();
    }

    final FragmentController mFragments = FragmentController.createController(new HostCallbacks());

先来看下这个HostCallbacks对象,初始化的时候传入了调用FragmentController.createController(new HostCallbacks())的FragmentActivity的实例的引用。

//HostCallbacks.java
        public HostCallbacks() {
            super(FragmentActivity.this /*fragmentActivity*/);
        }

构造器中只调用了父类的构造器,继续看HostCallbacks的父类FragmentHostCallback。构造器利用传进来的FragmentActivity的引用,为自己的成员变量赋值,可以看到,这个类的实例不仅持有了Activity的引用,还持有它的context,handler等。重点关注下mFragmentManager这个成员,它在HostCallbacks初始化的时候也初始化,是一个 FragmentManagerImpl对象。

    //FragmentHostCallback.java
    FragmentHostCallback(FragmentActivity activity) {
            this(activity, activity /*context*/, activity.mHandler, 0 /*windowAnimations*/);
        }

    FragmentHostCallback(Activity activity, Context context, Handler handler,
                int windowAnimations) {
            mActivity = activity;
            mContext = context;
            mHandler = handler;
            mWindowAnimations = windowAnimations;
        }
    private final Activity mActivity;
    final Context mContext;
    private final Handler mHandler;
    final int mWindowAnimations;
    final FragmentManagerImpl mFragmentManager = new FragmentManagerImpl();
    /** The loader managers for individual fragments [i.e. Fragment#getLoaderManager()] */
    private SimpleArrayMap<String, LoaderManager> mAllLoaderManagers;
    /** Whether or not fragment loaders should retain their state */
    private boolean mRetainLoaders;
    /** The loader manger for the fragment host [i.e. Activity#getLoaderManager()] */
    private LoaderManagerImpl mLoaderManager;
 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值