getSupportFragmentManager().beginTransaction().remove(Fragment fragment).commit()
java
BackStackRecord remove(Fragment fragment) BackStackRecord.commit() // 开始 BackStackRecord.commitInternal(boolean allowStateLoss) FragmentManagerImpl.enqueueAction(OpGenerator action, boolean allowStateLoss) // 涉及到Handler的延时处理 FragmentManager.scheduleCommit() { synchronized (this) { boolean postponeReady = mPostponedTransactions != null && !mPostponedTransactions.isEmpty(); boolean pendingReady = mPendingActions != null && mPendingActions.size() == 1; if (postponeReady || pendingReady) { mHost.getHandler().removeCallbacks(mExecCommit); mHost.getHandler().post(mExecCommit); } } }
handler将进一步操做Runnableide
Runnable mExecCommit = new Runnable() { @Override public void run() { execPendingActions(); } }; FragmentManager.execPendingActions() FragmentManager.doPendingDeferredStart() FragmentManager.startPendingDeferredFragments() FragmentManager.performPendingDeferredStart(Fragment f) FragmentManager.moveToState(Fragment f, int newState, int transit, int transitionStyle, boolean keepActive){ case Fragment.ACTIVITY_CREATED: onDestroyView(); mContainer.removeView(f.mView) f.view.dispatchDetachedFromWindow(); f.mContainer = null; f.mView = null; case Fragment.CREATED: f.performDestroy(); f.performDetach(); makeInactive(f); f.mHost = null; }
moveToState 是状态变化的核心方法,须要进一步查看源码post
FragmentActivity维护着FragmentManager一个实例,而FragmentManager管理者Fragment的各个状态, 查看FragmentManagerImpl源码中this
FragmentManagerImpl{ int mCurState = Fragment.INITIALIZING; //初始化状态 } Fragment{ static final int INITIALIZING = 0; // Not yet created. static final int CREATED = 1; // Created. static final int ACTIVITY_CREATED = 2; // The activity has finished its creation. static final int STOPPED = 3; // Fully created, not started. static final int STARTED = 4; // Created and started, not resumed. static final int RESUMED = 5; // Created started and resumed. }
mCurState就是当前FragmentManager的状态,mCurState只有一个方法中对其有赋值操做moveToState(int newState, boolean always)
而这个方法调用处以下:spa
public void dispatchCreate() { mStateSaved = false; mStopped = false; dispatchStateChange(Fragment.CREATED); } public void dispatchActivityCreated() { mStateSaved = false; mStopped = false; dispatchStateChange(Fragment.ACTIVITY_CREATED); } public void dispatchStart() { mStateSaved = false; mStopped = false; dispatchStateChange(Fragment.STARTED); } public void dispatchResume() { mStateSaved = false; mStopped = false; dispatchStateChange(Fragment.RESUMED); } public void dispatchPause() { dispatchStateChange(Fragment.STARTED); } public void dispatchStop() { mStopped = true; dispatchStateChange(Fragment.STOPPED); }
方法对应着状态值的调整,看命名好像和Activity的生命周期对于,咱们再对照FragmentActivity的源码code
public void dispatchCreate() { mHost.mFragmentManager.dispatchCreate(); } public void dispatchActivityCreated() { mHost.mFragmentManager.dispatchActivityCreated(); } public void dispatchStart() { mHost.mFragmentManager.dispatchStart(); } public void dispatchResume() { mHost.mFragmentManager.dispatchResume(); } public void dispatchPause() { mHost.mFragmentManager.dispatchPause(); } public void dispatchStop() { mHost.mFragmentManager.dispatchStop(); }
果真是由Activity来触发FragmentManager的状态变化 接下来详细看下FragmentManager.moveToState(Fragment f, int newState, int transit, int transitionStyle, boolean keepActive)
方法 简化以下:orm
if (f.mState < newState) { switch (f.mState) { case Fragment.INITIALIZING: //some code case Fragment.CREATED: if (newState > Fragment.CREATED) { //some code } case Fragment.ACTIVITY_CREATED: case Fragment.STOPPED: if (newState > Fragment.STOPPED) { //some code } case Fragment.STARTED: if (newState > Fragment.STARTED) { //some code } } } else if (f.mState > newState) { switch (f.mState) { case Fragment.RESUMED: if (newState < Fragment.RESUMED) { //some code } case Fragment.STARTED: if (newState < Fragment.STARTED) { //some code } case Fragment.STOPPED: if (newState < Fragment.STOPPED) { //some code } case Fragment.ACTIVITY_CREATED: if (newState < Fragment.ACTIVITY_CREATED) { //some code } case Fragment.CREATED: if (newState < Fragment.CREATED) { //some code } } } f.mState = newState;
在每一个case中都没有break,则会顺序执行,主要是fragment状态和FragmentManager的状态进行了对比,生命周期