dependencies {
val fragment_version ="1.3.4"// Java language implementationimplementation("androidx.fragment:fragment:$fragment_version")// Kotlinimplementation("androidx.fragment:fragment-ktx:$fragment_version")// Testing Fragments in IsolationdebugImplementation("androidx.fragment:fragment-testing:$fragment_version")}
Fragment 无论是单独使用还是配合Viewpager,对于Android开发来说非常熟悉了,但生命周期,一般就网上看到的一张图,想必大家也经常看到;
override fun onCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.test_activity3_activity)if(savedInstanceState ==null){
supportFragmentManager.beginTransaction().replace(R.id.container,TestActivity3Fragment.newInstance()).commitNow()}}
/* FragmentActivity类 *///创建FragmentController finalFragmentController mFragments =FragmentController.createController(newHostCallbacks());/**
* Return the FragmentManager for interacting with fragments associated
* with this activity.
*/@NonNullpublicFragmentManagergetSupportFragmentManager(){return mFragments.getSupportFragmentManager();}
1.2 FragmentController类
new HostCallbacks() 传进去,再获取 SupportFragmentManager。
publicclassFragmentController{privatefinalFragmentHostCallback<?> mHost;/**
* Returns a {@link FragmentController}.
*/@NonNullpublicstaticFragmentControllercreateController(@NonNullFragmentHostCallback<?> callbacks){returnnewFragmentController(checkNotNull(callbacks,"callbacks == null"));}privateFragmentController(FragmentHostCallback<?> callbacks){
mHost = callbacks;}/**
* 通过mHost获取FragmentManager
* Returns a {@link FragmentManager} for this controller.
*/@NonNullpublicFragmentManagergetSupportFragmentManager(){return mHost.mFragmentManager;}}
/*FragmentManager*///保存操作privatefinalArrayList<OpGenerator> mPendingActions =newArrayList<>();voidenqueueAction(@NonNullOpGenerator action,boolean allowStateLoss){if(!allowStateLoss){if(mHost ==null){if(mDestroyed){//FragmentManager 已经 销毁thrownewIllegalStateException("FragmentManager has been destroyed");}else{//FragmentManager 还没绑定thrownewIllegalStateException("FragmentManager has not been attached to a "+"host.");}}checkStateLoss();}//加锁synchronized(mPendingActions){if(mHost ==null){//commitAllowingStateLoss会走这里if(allowStateLoss){// This FragmentManager isn't attached, so drop the entire transaction.return;}thrownewIllegalStateException("Activity has been destroyed");}//加入到数组
mPendingActions.add(action);//最终来到这里scheduleCommit();}}
publicclassFragmentimplements...{staticfinalObject USE_DEFAULT_TRANSITION =newObject();staticfinalint INITIALIZING =-1;// Not yet attached.staticfinalint ATTACHED =0;// Attached to the host.staticfinalint CREATED =1;// Created.staticfinalint VIEW_CREATED =2;// View Created.staticfinalint AWAITING_EXIT_EFFECTS =3;// Downward state, awaiting exit effectsstaticfinalint ACTIVITY_CREATED =4;// Fully created, not started.staticfinalint STARTED =5;// Created and started, not resumed.staticfinalint AWAITING_ENTER_EFFECTS =6;// Upward state, awaiting enter effectsstaticfinalint RESUMED =7;// Created started and resumed.int mState = INITIALIZING;}
if (f.mState <= newState) ,如果true , 可以看到后面的代码是创建流程,比如 Fragment.INITIALIZING ,ATTACHED,CREATED等等,否则就是销毁流程,这里就放一部分代码,可以自己去源码看看所有流程。
voidmoveToState(int newState,boolean always){...moveFragmentToExpectedState(f);...}voidmoveFragmentToExpectedState(@NonNullFragment f){...moveToState(f);...}voidmoveToState(@NonNullFragment f){moveToState(f, mCurState);}voidmoveToState(@NonNullFragment f,int newState){//获取FragmentStateManager FragmentStateManager fragmentStateManager = mFragmentStore.getFragmentStateManager(f.mWho);if(fragmentStateManager ==null){
fragmentStateManager =newFragmentStateManager(mLifecycleCallbacksDispatcher,
mFragmentStore, f);
fragmentStateManager.setFragmentManagerState(Fragment.CREATED);}if(f.mFromLayout && f.mInLayout && f.mState ==Fragment.VIEW_CREATED){
newState =Math.max(newState,Fragment.VIEW_CREATED);}//这里跟官方提供的懒加载有关,可以限制fragment执行到哪个阶段
newState =Math.min(newState, fragmentStateManager.computeExpectedState());if(f.mState <= newState){// If we are moving to the same state, we do not need to give up on the animation.if(f.mState < newState &&!mExitAnimationCancellationSignals.isEmpty()){// The fragment is currently being animated... but! Now we// want to move our state back up. Give up on waiting for the// animation and proceed from where we are.cancelExitAnimation(f);}switch(f.mState){caseFragment.INITIALIZING:if(newState >Fragment.INITIALIZING){
fragmentStateManager.attach();}// fall throughcaseFragment.ATTACHED:if(newState >Fragment.ATTACHED){
fragmentStateManager.create();}// fall throughcaseFragment.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();}// fall through...}}elseif(f.mState > newState){switch(f.mState){caseFragment.RESUMED:if(newState <Fragment.RESUMED){
fragmentStateManager.pause();}// fall throughcaseFragment.STARTED:if(newState <Fragment.STARTED){
fragmentStateManager.stop();}// fall through...}}if(f.mState != newState){if(isLoggingEnabled(Log.DEBUG)){Log.d(TAG,"moveToState: Fragment state for "+ f +" not updated inline; "+"expected state "+ newState +" found "+ f.mState);}
f.mState = newState;}}
caseFragment.CREATED:if(newState >Fragment.CREATED){
fragmentStateManager.createView();}/*FragmentStateManager*/voidcreateView(){...
mFragment.performCreateView(layoutInflater, container, mFragment.mSavedFragmentState);...
}
/*Fragment*/voidperformCreateView(@NonNullLayoutInflater inflater,@NullableViewGroup container,@NullableBundle savedInstanceState){
mChildFragmentManager.noteStateNotSaved();
mPerformedCreateView =true;
mViewLifecycleOwner =newFragmentViewLifecycleOwner(getViewModelStore());
mView =onCreateView(inflater, container, savedInstanceState);if(mView !=null){// Initialize the view lifecycle
mViewLifecycleOwner.initialize();// Tell the fragment's new view about it before we tell anyone listening// to mViewLifecycleOwnerLiveData and before onViewCreated, so that calls to// ViewTree get() methods return something meaningfulViewTreeLifecycleOwner.set(mView, mViewLifecycleOwner);ViewTreeViewModelStoreOwner.set(mView, mViewLifecycleOwner);ViewTreeSavedStateRegistryOwner.set(mView, mViewLifecycleOwner);// Then inform any Observers of the new LifecycleOwner
mViewLifecycleOwnerLiveData.setValue(mViewLifecycleOwner);}else{if(mViewLifecycleOwner.isInitialized()){thrownewIllegalStateException("Called getViewLifecycleOwner() but "+"onCreateView() returned null");}
mViewLifecycleOwner =null;}}