先說(shuō)一下
之前我覺(jué)得v4包下的fragment和app下的fragment生命周期應(yīng)該是一樣的,結(jié)果不一樣睹限。
app包下的fragment生命周期
開(kāi)關(guān)屏幕時(shí)fragment的生命周期
直接在最開(kāi)始使用add方法添加到activity后,fragemnt的生命周期
關(guān)閉屏幕后的生命周期:
打開(kāi)屏幕后的生命周期:
銷(xiāo)毀activity后的生命周期:
調(diào)用各個(gè)方法后fragment的生命周期
當(dāng)fragment1加載后粉私,點(diǎn)擊按鈕后用add方法加載fragment2后生命周期:
調(diào)用remove方法后fragment生命周期:
調(diào)用attach后fragment的生命周期:
調(diào)用detach后fragment的生命周期:
調(diào)用replace加載fragment2后fragment2以及fragment1的生命周期
銷(xiāo)毀activity后的生命周期:
v4包下的fragment生命周期
開(kāi)關(guān)屏幕時(shí)的fragment生命周期
直接最開(kāi)始使用add方法添加到activity后帅掘,fragemnt的生命周期
關(guān)閉屏幕后的生命周期:
打開(kāi)屏幕后的生命周期:
銷(xiāo)毀activity后的生命周期:
調(diào)用各個(gè)方法后fragment的生命周期
當(dāng)fragment1加載后珊佣,點(diǎn)擊按鈕后用add方法加載fragment2后生命周期:
調(diào)用remove方法后fragment生命周期
調(diào)用attach后fragment的生命周期:
調(diào)用detach后fragment的生命周期:
調(diào)用replace加載fragment2后fragment2以及fragment1的生命周期
總結(jié)
1.顯示fragment有add,attach惯退,show赌髓。消失fragment有remove,detach催跪,hide锁蠕。第一次fragment要?jiǎng)討B(tài)添加到activity中,必須使用add方法叠荠,增加到回退棧只能通過(guò)addToBackStack()方法匿沛。
2.調(diào)用add方法運(yùn)行的生命周期是從onAttach到onResume,(app包下的fragment是從onCreate到onResume)榛鼎,remove方法運(yùn)行周期是onPause到onDetach逃呼,并且,都是先銷(xiāo)毀再添加者娱,即調(diào)用add方法的時(shí)候還調(diào)用了銷(xiāo)毀的方法抡笼,那么都是先銷(xiāo)毀再添加,但是由于v4下的fragment在add方法的時(shí)候會(huì)執(zhí)行onAttach到onResume黄鳍,就像我在上一篇博客(viewPager下fragment生命周期)中講的一樣推姻,fragment的onAttach,onCreate都會(huì)在別的fragment的除了onAttach框沟,onCreate之外的生命周期之前藏古,所以增炭,調(diào)用replace方法后的生命周期,v4下的fragment是這樣拧晕,app下的fragment是那樣隙姿。并且,在remove的時(shí)候調(diào)用 addToBackStack()方法厂捞,那么調(diào)用remove生命周期只會(huì)是onPause到onDestroyView输玷。
3.調(diào)用attach方法運(yùn)行的生命周期是onCreateView到onResume ,detach方法運(yùn)行生命周期是onPause到onDestroyView 靡馁,同時(shí)這兩個(gè)誰(shuí)先使用誰(shuí)先調(diào)用欲鹏,也就是那邊的生命周期先走。這個(gè)方法的作用就是將fragment試圖粘到UI試圖中臭墨,而不是將fragment粘在activity上赔嚎。
4.調(diào)用show()和hide()方法不會(huì)運(yùn)行聲明周期。
5.要想消失后正確的顯示裙犹,必須調(diào)用與讓其消失對(duì)應(yīng)的方法尽狠,即如果你通過(guò)detach方法讓fragment消失,那么就要用attach方法叶圃,別的都不行袄膏。對(duì)別的也是一樣。
6.因?yàn)閒ragment是依賴(lài)activity的掺冠,所以沉馆,activity先于fragment準(zhǔn)備好,后于fragment消失德崭,
但是斥黑,v4下的fragment的onStart在activity的onstart之前,這一點(diǎn)眉厨,可以翻閱源碼查看:
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!");
}