android.support.v4.app.Fragment源码解析

来源:互联网 发布:淘宝客推广流量怎么样 编辑:程序博客网 时间:2024/05/22 14:04

Fragment最基础功能使用

FragmentManager fm=getFragmentManager();  FragmentTransaction transaction=fm.beginTransaction();  mFirstFragment=new FirstFragment();  transaction.add(R.id.fragment,mFirstFragment);  transaction.commit();  

中逐一跟进源码
(1)从Activity获取getFragmentManager()

    public FragmentManager getSupportFragmentManager() {        return this.mFragments;    }    final FragmentManagerImpl mFragments = new FragmentManagerImpl();

FragmentManagerImpl是FragmentManager抽象类的具体实现,FragmentManager定义了获取事务beginTransaction(),已进栈的Fragment getFragments()。。。

public abstract class FragmentManager {    public static final int POP_BACK_STACK_INCLUSIVE = 1;    public abstract FragmentTransaction beginTransaction();    @Deprecated    public FragmentTransaction openTransaction() {        return this.beginTransaction();    }    public abstract boolean executePendingTransactions();    public abstract Fragment findFragmentById(int arg0);    public abstract Fragment findFragmentByTag(String arg0);    public abstract void popBackStack();    public abstract boolean popBackStackImmediate();    public abstract void popBackStack(String arg0, int arg1);    public abstract boolean popBackStackImmediate(String arg0, int arg1);    public abstract void popBackStack(int arg0, int arg1);    public abstract boolean popBackStackImmediate(int arg0, int arg1);    public abstract int getBackStackEntryCount();    public abstract FragmentManager.BackStackEntry getBackStackEntryAt(int arg0);    public abstract void addOnBackStackChangedListener(FragmentManager.OnBackStackChangedListener arg0);    public abstract void removeOnBackStackChangedListener(FragmentManager.OnBackStackChangedListener arg0);    public abstract void putFragment(Bundle arg0, String arg1, Fragment arg2);    public abstract Fragment getFragment(Bundle arg0, String arg1);    public abstract List<Fragment> getFragments();    public abstract SavedState saveFragmentInstanceState(Fragment arg0);    public abstract boolean isDestroyed();    public abstract void dump(String arg0, FileDescriptor arg1, PrintWriter arg2, String[] arg3);    public static void enableDebugLogging(boolean enabled) {        FragmentManagerImpl.DEBUG = enabled;    }    public interface BackStackEntry {        int getId();        String getName();        int getBreadCrumbTitleRes();        int getBreadCrumbShortTitleRes();        CharSequence getBreadCrumbTitle();        CharSequence getBreadCrumbShortTitle();    }    public interface OnBackStackChangedListener {        void onBackStackChanged();    }}

(2)获取事务FragmentTransaction
FragmentManagerImpl中实例化FragmentTransaction

    public FragmentTransaction beginTransaction() {        return new BackStackRecord(this);    }

(3)BackStackRecord

final class BackStackRecord extends FragmentTransaction implements BackStackEntry, Runnable

( 4 ) 添加事务add
BackStackRecord内部维护了一个存储Fragment的双向链表,往链表尾部添加新Fragment

    void addOp(BackStackRecord.Op op) {        if (this.mHead == null) {            this.mHead = this.mTail = op;        } else {            op.prev = this.mTail;            this.mTail.next = op;            this.mTail = op;        }        op.enterAnim = this.mEnterAnim;        op.exitAnim = this.mExitAnim;        op.popEnterAnim = this.mPopEnterAnim;        op.popExitAnim = this.mPopExitAnim;        ++this.mNumOp;    }

( 5 )提交事务commit
不管是commit还是commitAllowingStateLoss,内部都执行了commitInternal(boolean allowStateLoss) ,最后通过FragmentManagerImpl
this.mManager.enqueueAction(this, allowStateLoss);

public void enqueueAction(Runnable action, boolean allowStateLoss) {        if (!allowStateLoss) {            this.checkStateLoss();        }        synchronized (this) {            if (!this.mDestroyed && this.mActivity != null) {                if (this.mPendingActions == null) {                    this.mPendingActions = new ArrayList();                }                this.mPendingActions.add(action);                if (this.mPendingActions.size() == 1) {                    this.mActivity.mHandler.removeCallbacks(this.mExecCommit);                    this.mActivity.mHandler.post(this.mExecCommit);                }            } else {                throw new IllegalStateException("Activity has been destroyed");            }        }    }

mPendingActions是装载Runnable的集合,enqueueAction就是把Runnable (BackStackRecord)加入到了集合中,
然后执行了mExecCommit(Runnble)

    Runnable mExecCommit = new Runnable() {        public void run() {            FragmentManagerImpl.this.execPendingActions();        }    };

execPendingActions是将mPendingActions的Runnable拷贝到mTmpActions,最后执行mTmpActions[i].run()(即BackStackRecord.run())执行了transaction.add(通过BackStackRecord.Op op的标志识别操作)操作

public boolean execPendingActions() {        if (this.mExecutingActions) {            throw new IllegalStateException("Recursive entry to executePendingTransactions");        } else if (Looper.myLooper() != this.mActivity.mHandler.getLooper()) {            throw new IllegalStateException("Must be called from main thread of process");        } else {            boolean didSomething = false;            int i;            while (true) {                int loadersRunning;                synchronized (this) {                    if (this.mPendingActions == null || this.mPendingActions.size() == 0) {                        break;                    }                    loadersRunning = this.mPendingActions.size();                    if (this.mTmpActions == null || this.mTmpActions.length < loadersRunning) {                        this.mTmpActions = new Runnable[loadersRunning];                    }                    this.mPendingActions.toArray(this.mTmpActions);                    this.mPendingActions.clear();                    this.mActivity.mHandler.removeCallbacks(this.mExecCommit);                }                this.mExecutingActions = true;                for (i = 0; i < loadersRunning; ++i) {                    this.mTmpActions[i].run();                    this.mTmpActions[i] = null;                }                this.mExecutingActions = false;                didSomething = true;            }            if (this.mHavePendingDeferredStart) {                boolean arg5 = false;                for (i = 0; i < this.mActive.size(); ++i) {                    Fragment f = (Fragment) this.mActive.get(i);                    if (f != null && f.mLoaderManager != null) {                        arg5 |= f.mLoaderManager.hasRunningLoaders();                    }                }                if (!arg5) {                    this.mHavePendingDeferredStart = false;                    this.startPendingDeferredFragments();                }            }            return didSomething;        }    }

根据标识执行事务

public void run() {        if (FragmentManagerImpl.DEBUG) {            Log.v("FragmentManager", "Run: " + this);        }        if (this.mAddToBackStack && this.mIndex < 0) {            throw new IllegalStateException("addToBackStack() called after commit()");        } else {            this.bumpBackStackNesting(1);            for (BackStackRecord.Op op = this.mHead; op != null; op = op.next) {                Fragment f;                switch (op.cmd) {                case 1:                    f = op.fragment;                    f.mNextAnim = op.enterAnim;                    this.mManager.addFragment(f, false);                    break;                case 2:                    f = op.fragment;                    if (this.mManager.mAdded != null) {                        for (int i = 0; i < this.mManager.mAdded.size(); ++i) {                            Fragment old = (Fragment) this.mManager.mAdded.get(i);                            if (FragmentManagerImpl.DEBUG) {                                Log.v("FragmentManager", "OP_REPLACE: adding=" + f + " old=" + old);                            }                            if (f == null || old.mContainerId == f.mContainerId) {                                if (old == f) {                                    f = null;                                    op.fragment = null;                                } else {                                    if (op.removed == null) {                                        op.removed = new ArrayList();                                    }                                    op.removed.add(old);                                    old.mNextAnim = op.exitAnim;                                    if (this.mAddToBackStack) {                                        ++old.mBackStackNesting;                                        if (FragmentManagerImpl.DEBUG) {                                            Log.v("FragmentManager",                                                    "Bump nesting of " + old + " to " + old.mBackStackNesting);                                        }                                    }                                    this.mManager.removeFragment(old, this.mTransition, this.mTransitionStyle);                                }                            }                        }                    }                    if (f != null) {                        f.mNextAnim = op.enterAnim;                        this.mManager.addFragment(f, false);                    }                    break;                case 3:                    f = op.fragment;                    f.mNextAnim = op.exitAnim;                    this.mManager.removeFragment(f, this.mTransition, this.mTransitionStyle);                    break;                case 4:                    f = op.fragment;                    f.mNextAnim = op.exitAnim;                    this.mManager.hideFragment(f, this.mTransition, this.mTransitionStyle);                    break;                case 5:                    f = op.fragment;                    f.mNextAnim = op.enterAnim;                    this.mManager.showFragment(f, this.mTransition, this.mTransitionStyle);                    break;                case 6:                    f = op.fragment;                    f.mNextAnim = op.exitAnim;                    this.mManager.detachFragment(f, this.mTransition, this.mTransitionStyle);                    break;                case 7:                    f = op.fragment;                    f.mNextAnim = op.enterAnim;                    this.mManager.attachFragment(f, this.mTransition, this.mTransitionStyle);                    break;                default:                    throw new IllegalArgumentException("Unknown cmd: " + op.cmd);                }            }            this.mManager.moveToState(this.mManager.mCurState, this.mTransition, this.mTransitionStyle, true);            if (this.mAddToBackStack) {                this.mManager.addBackStackState(this);            }        }    }

run方法执行完最后执行,

        this.mManager.moveToState(this.mManager.mCurState, this.mTransition, this.mTransitionStyle, true);            if (this.mAddToBackStack) {                this.mManager.addBackStackState(this);            }

moveToState是把每次执行完的状态保存到Fragment中,这个方法最终会将FragmentManager的状态赋值给fragment(过程:通过Activity生命周期的回调和Fragment的状态执行Fragment独有的生命周期方法)
addBackStackState是加入回退栈

阅读全文
0 0