先说一下

之前我觉得v4包下的fragment和app下的fragment生命周期应该是一样的,结果不一样。

app包下的fragment生命周期

开关屏幕时fragment的生命周期

直接在最开始使用add方法添加到activity后,fragemnt的生命周期
appfragmentfirstAdd-20161110

关闭屏幕后的生命周期:

appfragment1 closecereen-20161110

打开屏幕后的生命周期:

appfragment1openscreen-20161110

销毁activity后的生命周期:

appfragmentthenactivitydestroy-20161110

调用各个方法后fragment的生命周期

当fragment1加载后,点击按钮后用add方法加载fragment2后生命周期:

appfragment2Add-20161110

调用remove方法后fragment生命周期:

appfragmentremove-20161110

调用attach后fragment的生命周期:

appfragment1Attach-20161110

调用detach后fragment的生命周期:

appfragment1detach-20161110

调用replace加载fragment2后fragment2以及fragment1的生命周期

appafterfragment1Addthenreplace-20161110

销毁activity后的生命周期:

v4包下的fragment生命周期

开关屏幕时的fragment生命周期

直接最开始使用add方法添加到activity后,fragemnt的生命周期
v4fragemntfirstAdd-20161110

关闭屏幕后的生命周期:

v4fragment1closescreen-20161110

打开屏幕后的生命周期:

v4fragment1openscreen-20161110

销毁activity后的生命周期:

v4fragmentthenactivitydestroy-20161110

调用各个方法后fragment的生命周期

当fragment1加载后,点击按钮后用add方法加载fragment2后生命周期:

v4fragment2 Add-20161110

调用remove方法后fragment生命周期

v4fragment1Remove-20161110

调用attach后fragment的生命周期:

v4fragment1Attach-20161110

调用detach后fragment的生命周期:

v4fragment1 Detach-20161110

调用replace加载fragment2后fragment2以及fragment1的生命周期

v4afterfragment1 Addthenreplace-20161110

总结

1.显示fragment有add,attach,show。消失fragment有remove,detach,hide。第一次fragment要动态添加到activity中,必须使用add方法,增加到回退栈只能通过addToBackStack()方法。
2.调用add方法运行的生命周期是从onAttach到onResume,(app包下的fragment是从onCreate到onResume),remove方法运行周期是onPause到onDetach,并且,都是先销毁再添加,即调用add方法的时候还调用了销毁的方法,那么都是先销毁再添加,但是由于v4下的fragment在add方法的时候会执行onAttach到onResume,就像我在上一篇博客(viewPager下fragment生命周期)中讲的一样,fragment的onAttach,onCreate都会在别的fragment的除了onAttach,onCreate之外的生命周期之前,所以,调用replace方法后的生命周期,v4下的fragment是这样,app下的fragment是那样。并且,在remove的时候调用 addToBackStack()方法,那么调用remove生命周期只会是onPause到onDestroyView。
3.调用attach方法运行的生命周期是onCreateView到onResume ,detach方法运行生命周期是onPause到onDestroyView ,同时这两个谁先使用谁先调用,也就是那边的生命周期先走。这个方法的作用就是将fragment试图粘到UI试图中,而不是将fragment粘在activity上。
4.调用show()和hide()方法不会运行声明周期。
5.要想消失后正确的显示,必须调用与让其消失对应的方法,即如果你通过detach方法让fragment消失,那么就要用attach方法,别的都不行。对别的也是一样。
6.因为fragment是依赖activity的,所以,activity先于fragment准备好,后于fragment消失
但是,v4下的fragment的onStart在activity的onstart之前,这一点,可以翻阅源码查看:
v4下fragment的onStart源码:

/**
 * Called when the Fragment is visible to the user.  This is generally
 * tied to {@link Activity#onStart() Activity.onStart} of the containing
 * Activity's lifecycle.
 */
@CallSuper
public void onStart() {
    mCalled = true;

    if (!mLoadersStarted) {
        mLoadersStarted = true;
        if (!mCheckedForLoaderManager) {
            mCheckedForLoaderManager = true;
            mLoaderManager = mHost.getLoaderManager(mWho, mLoadersStarted, false);
        }
        if (mLoaderManager != null) {
            mLoaderManager.doStart();
        }
    }
}

app下fragment的onStart源码

public void onStart() {
    throw new RuntimeException("Stub!");
}