先说一下
之前我觉得v4包下的fragment和app下的fragment生命周期应该是一样的,结果不一样。
app包下的fragment生命周期
开关屏幕时fragment的生命周期
直接在最开始使用add方法添加到activity后,fragemnt的生命周期
关闭屏幕后的生命周期:
打开屏幕后的生命周期:
销毁activity后的生命周期:
调用各个方法后fragment的生命周期
当fragment1加载后,点击按钮后用add方法加载fragment2后生命周期:
调用remove方法后fragment生命周期:
调用attach后fragment的生命周期:
调用detach后fragment的生命周期:
调用replace加载fragment2后fragment2以及fragment1的生命周期
销毁activity后的生命周期:
v4包下的fragment生命周期
开关屏幕时的fragment生命周期
直接最开始使用add方法添加到activity后,fragemnt的生命周期
关闭屏幕后的生命周期:
打开屏幕后的生命周期:
销毁activity后的生命周期:
调用各个方法后fragment的生命周期
当fragment1加载后,点击按钮后用add方法加载fragment2后生命周期:
调用remove方法后fragment生命周期
调用attach后fragment的生命周期:
调用detach后fragment的生命周期:
调用replace加载fragment2后fragment2以及fragment1的生命周期
总结
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!");
}