Android Gems — Fragment本质之生命周期管理

Fragment最早引入是在给平板的Android 3.0系统,用来解决Pad上UI的模块化。随后逐渐推广到Phone UI上,3.0之前的版本则通过Support包引入。Fragment本质上是带生命周期管理的View的Wrapper,解耦了Activity和View,一方面Activity可以不用再处理View的逻辑;另一方面View也可以只专注渲染,不用关心Controller逻辑。
摘要由CSDN通过智能技术生成

Fragment最早引入是在给平板的Android 3.0系统,用来解决Pad上UI的模块化。随后逐渐推广到Phone UI上,3.0之前的版本则通过Support包引入。Fragment本质上是带生命周期管理的View的Wrapper,解耦了Activity和View,一方面Activity可以不用再处理View的逻辑;另一方面View也可以只专注渲染,不用关心Controller逻辑。Fragment就是他们之间的桥梁,使得UI模块可以方便的被各个Activity复用。
Fragment对开发者已经不再陌生,本文也并不打算介绍Fragment的api使用,而是分析Fragment的源码,从源码的角度来对Fragment的使用有更深刻的理解。
Fragment相关的源码存放在framework/base/core/java/android/app/下,有如下几个重要的类:
一,Fragment
Fragment基本类,生命周期如下:

    void onAttach(Context context)
    void onCreate(Bundle savedInstanceState)
    View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    void onActivityCreated(Bundle savedInstanceState)
    void onStart()
    void onStop()
    void onResume()
    void onPause()
    void onDestroyView()
    void onDestroy()
    void onDetach()
Fragment的生命周期和Activity是对应的。
二,FragmentManager
FragmentManager是Fragment生命周期管理的核心类,确切的说,他是个抽象类,具体的实现是FragmentManagerImpl,所有的Fragment的管理:添加、删除、显示、隐藏等都由FragmentManagerImpl完成。
三,FragmentController
Activity拥有FragmentController的实例,通过FragmentController来分发Activity的生命周期事件,而FragmentController只是给外部的FragmentManager接口的wrapper,实际的实现还是由FragmentManager来完成。
四,FragmentTransaction
FragmentTransaction是一组Fragment操作集合,由FragmentManager调用beginTransaction来获得一个FragmentTransaction,之后可以执行add/replace/remove等Fragment操作,在调用Transaction的commit之前,这些操作还并未生效。FragmentTransaction之所以被称为事务,是因为它执行的Fragment Op集合是可以回退的,后面我们做源码分析的时候会详细分析。FragmentTransaction是个抽象类,实现类是BackStackRecord。
Fragment本质系列文章将从如下几个角度,有针对性的对Fragment进行源码分析,分析Fragment本质,从而达到深入浅出的目的。
一,Fragment的生命周期管理
二,Fragment的View管理
三,FragmentTransaction的事务和BackStack管理
四,Fragment的状态保存和恢复
本文先分析Fragment的生命周期管理:
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.
FragmentManager的mCurState状态是Activity的生命周期是保持一致的,而每个Fragment里有mState字段表示自己单独的状态,会通过moveToState来和FragmentManager的mCurState状态保持同步。为什么这样设计呢?原因是Fragment是可以动态add的,添加的时候,Activity的可以在任何的阶段,而FragmentManager是静态的,从Activity创建的时候就存在,因此就用FragmentManager来和Activity保持同步,而Fragment add之后将会和其同步状态。下面的这些dispatch函数定义在FragmentManager里,Activity在其生命周期里通过FragmentController调用这些方法,完成Activity和FragmentManager之间的状态同步:
    public void dispatchCreate() {
        mStateSaved = false;
        moveToState(Fragment.CREATED, false);
    }    
    public void dispatchActivityCreated() {
        mStateSaved = false;
        moveToState(Fragment.ACTIVITY_CREATED, false);
    }    
    public void dispatchStart() {
        mStateSaved = false;
        moveToState(Fragment.STARTED, false);
    }    
    public void dispatchResume() {
        mStateSaved = false;
        moveToState(Fragment.RESUMED, false);
    }    
    public void dispatchPause() {
        moveToState(Fragment.STARTED, false);
    }    
    public void dispatchStop() {
        moveToState(Fragment.STOPPED, false);
    }    
    public void dispatchDestroy() {
        mDestroyed = true;
        execPendingActions();
        moveToState(Fragment.INITIALIZING, false);
        mHost = null;
        mContainer = null;
        mParent = null;
    }
Activity的onCreate调用dispatchCreate,dispatchActivityCreated方法,这时候FragmentManager的状态就切换成ACTIVITY_CREATED,Activity的onStart执行dispatchStart把状态切换成STARTED,onResume切换成RESUMED状态,onPause切换STARTED,onStop切换成STOPPED,onDestroy就切换到了最初的INITIALIZING。这样FragmentManager就保证了和Activity的生命周期保持一致。
FragmentManager的状态是静态的还比较简单,接下来就得分析Fragment的状态切换了。Fragment刚new出来时的初始状态mState是INITIALIZING,状态切换是由FragmentManager的moveToState函数完成。Fragment状态切换是和Fragment的几个操作分不开的,我们先对Fragment的基本操作进行分析,再对moveToState方法做分析。
我们总结一下FragmentTransaction的几个基本操作:
1, add
FragmentTransaction的事务实现细节,我们放到后面的章节介绍,只需知道add的操作最后调用FragmentManager的addFragment方法来增加Fragment
    public void addFragment(Fragment fragment, boolean moveToStateNow) {
        if (mAdded == null) {
            mAdded = new ArrayList<Fragment>();
        }
        if (DEBUG) Log.v(TAG, "add: " + fragment);
        makeActive(fragment);    // 将Fragment加入mActive
        if (!fragment.mDetached) {   // 忽略已经detach的Fragment
            if (mAdded.contains(fragment)) {
                throw new IllegalStateException("Fragment already added: " + fragment);
            }
            mAdded.add(fragment);  // 加如mAdded数组
            fragment.mAdded = true;
            fragment.mRemoving = false;
            if (fragment.mHasMenu && fragment.mMenuVisible) {
                mNeedMenuInvalidate = true;
            }
            if (moveToStateNow) {
                moveToState(fragment);
            }
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值