scheduleCommit();
}
}
该方法最终调用到scheduleCommit()方法
2. FragmentManager.scheduleCommit()
void scheduleCommit() {
synchronized (mPendingActions) {
boolean postponeReady =
mPostponedTransactions != null && !mPostponedTransactions.isEmpty();
boolean pendingReady = mPendingActions.size() == 1;
if (postponeReady || pendingReady) {
mHost.getHandler().removeCallbacks(mExecCommit);
mHost.getHandler().post(mExecCommit);
updateOnBackPressedCallbackEnabled();
}
}
}
该方法最终通过Handler执行mExecCommit
3. FragmentManager.mExecCommit
private Runnable mExecCommit = new Runnable() {
@Override
public void run() {
execPendingActions(true);
}
};
该方法最终调用execPendingActions
4. FragmentManager.execPendingActions()
boolean execPendingActions(boolean allowStateLoss) {
ensureExecReady(allowStateLoss);
boolean didSomething = false;
while (generateOpsForPendingActions(mTmpRecords, mTmpIsPop)) {
mExecutingActions = true;
try {
removeRedundantOperationsAndExecute(mTmpRecords, mTmpIsPop);
} finally {
cleanupExec();
}
didSomething = true;
}
updateOnBackPressedCallbackEnabled();
doPendingDeferredStart();
mFragmentStore.burpActive();
return didSomething;
}
重点关注removeRedundantOperationsAndExecute(mTmpRecords, mTmpIsPop)
5. FragmentManager.removeRedundantOperationsAndExecute()
private void removeRedundantOperationsAndExecute(@NonNull ArrayList records,
@NonNull ArrayList isRecordPop) {
}
方法比较长省略代码,最终调用executeOpsTogether
6. FragmentManager.executeOpsTogether
private void executeOpsTogether(@NonNull ArrayList records,
@NonNull ArrayList isRecordPop, int startIndex, int endIndex) {
}
方法比较长省略代码,最终调用executeOps方法
7. FragmentManager.executeOps()
private static void executeOps(@NonNull ArrayList records,
@NonNull ArrayList isRecordPop, int startIndex, int endIndex) {
for (int i = startIndex; i < endIndex; i++) {
final BackStackRecord record = records.get(i);
final boolean isPop = isRecordPop.get(i);
if (isPop) {
record.bumpBackStackNesting(-1);
// Only execute the add operations at the end of
// all transactions.
boolean moveToState = i == (endIndex - 1);
record.executePopOps(moveToState);
} else {
record.bumpBackStackNesting(1);
record.executeOps();
}
}
}
该方法分为两种情况,入栈和出栈,对应commit()和FragmentManager.popBackStack()操作。
8. FragmentManager.executeOps()
void executeOps