大概了解下Fragment如何依赖于FragmentActivity
我们一般在FragmentActivity做有关Fragment事务处理的时候都会用到
FragmentManager fm = getSupportFragmentManager();
getSupportFragmentManager方法调用了 mFragments.getSupportFragmentManager()
这里的mFragments是FragmentActivity加载的时候已经完成了赋值
final FragmentController mFragments = FragmentController.createController(new FragmentActivity.HostCallbacks());
另:
1 HostCallbacks 这里的HostCallbacks继承了FragmentHostCallback,FragmentHostCallback是Fragment和宿主FragmentActivity之间的桥梁,通过它可以回调FragmentActivity的方法。
HostCallBacks 重写了父类的几个方法,其中用的比较多的是onStartActivityFromFragment、onStartIntentSenderFromFragment等. 并且HostCallBacks 保存了FragmentActivity的引用,便于Fragment调用FragmentActivity的方法。
FragmentHostCallback是一个抽象类,负责调用各种各样的回调,这样的话,当Avtivity的状态,生命周期发生改变的时候,就可以通过这个回调接口进行统一管理,在上面提到的HostCallbacks是FragmentActivity里面的一个继承FragmentHostCallback的内部类。
2 FragmentController
类加载的的时候初始化了 FragmentManagerImpl(FragmentManager的实现类)
final FragmentManagerImpl mFragmentManager = new FragmentManagerImpl();
FragmentController定义了所有对Fragment的管理操作,包括我们的Activity在onCreate,onResume,onDestroy等各种生命周期或回调对Fragment的影响,都是由这个类来控制的。
3 FragmentManagerImpl(FragmentManager的实现类)
FragmentManagerImpl里面的具体实现就是有关Fragment是如何运行的,各种各样的生命周期,判断Fragment的不同状态,切换状态。
4 FragmentTransaction
处理Fragment的事务,例如add、remove、hide等。
Transaction只是用作记录对Fragment的操作记录,最终调用commit的时候,实际上调用的还是FragmentManagerImpl的方法
5.主线程执行Transaction事务
FragmentManager 靠 mActive存储Fragment
FragmentManagerImpl的 execPendingActions 方法---> performPendingDeferredStart -->moveToState-->根据f.mState 状态回调Fragment生命周期
总结:
1.在FragmentActivity初始完成之后,创建了一个FragmentController,FragmentController有一个成员变量是HostCallbacks,它含有当前FragmentActivity的引用,
HostCallbacks被实例化以后它的一个成员变量 FragmentManagerImpl 被初始化。
2.当调用getSupportFragmentManager 的时候,调用了HostCallbacks父类FragmentCallBacks的getSupportFragmentManager方法,返回就是第一步已完成初始化的
FragmentManagerImpl。
3.开启一个Fragmetn事务时,调用FragmentManagerImpl的beginTransaction方法,
就是调用new BackStackRecord(this)。这里创建了一个含有FragmentManagerImpl引用的FragmentTransaction对象.外界添加add 删除 remove 显示show 隐藏 hide
替换replace 都是调用doAddOp()方法,将属性值保存在Op的对象中。
4.调用BackStardRecord的 beginTransaction实际是调用它的commitInternal(boolean allowStateLoss)方法
BackStackState
BackStackRecord(继承FragmentTransaction,控制Fragment回退栈的入口)