Fragment切換時的生命周期

下面這張Fragment生命周期圖大家應該看得很多了:

但最近在寫PageManager(管理頁面跳轉(zhuǎn)),發(fā)現(xiàn)切換頁面時,之前的頁面走完onDestoryView就直接onDestory了,回來又重新onCreate,如果用hide和show的方式,都不走生命周期,看了ApiDemo代碼,發(fā)現(xiàn)原因,整理一下.

切換Fragment有兩種方式,一種是add新的,并把舊的hide,另一種是replace.

舊的Fragment為Fragment1,新的是Fragment2,忽略非關(guān)鍵生命周期。

使用add方法切換時:

載入Fragment1

Fragment1 onCreate

Fragment1 onCreateView

Fragment1 onStart

Fragment1 onResume

用以下代碼切到Fragment2:

FragmentTransaction ft=getFragmentManager().beginTransaction();ft.hide(Fragment1);ft.add(R.id.simple_fragment, Fragment2);ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);ft.commit();

Fragment1不走任何生命周期,但會調(diào)onHiddenChanged方法

Fragment2 onCreate

Fragment2 onCreateView

Fragment2 onStart

Fragment2 onResume

回到Fragment1,Remove Fragment2:

FragmentTransaction ft=getFragmentManager().beginTransaction();ft.remove(Fragment2);ft.show(Fragment1);ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);ft.commit();

Fragment1還是不走任何生命周期,調(diào)onHiddenChanged方法

Fragment2 onPause

Fragment2 onStop

Fragment2 onDestoryView

Fragment2 onDestory

用這種方法切換,F(xiàn)ragment在隱藏時并不會走onDestoryView,所以顯示時也不會走onCreateView,所有View都一直保存在內(nèi)存中。

用replace方法:

載入Fragment1生命周期與上面相同:

Fragment1 onCreate

Fragment1 onCreateView

Fragment1 onStart

Fragment1 onResume

切到Fragment2:

FragmentTransaction ft=getFragmentManager().beginTransaction();ft.replace(R.id.simple_fragment, Fragment2);ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);ft.commit();

這次的Fragment1走生命周期了

Fragment1 onPause

Fragment1 onStop

Fragment1 onDestoryView

Fragment1 onDestory

Fragment2 onCreate

Fragment2 onCreateView

Fragment2 onStart

Fragment2 onResume

真實打印出來可能是Fragment1和Fragment2混在一起的,可以看到,F(xiàn)ragment1走了onDestory,被完全回收了!

再切回到Fragment1

FragmentTransaction ft=getFragmentManager().beginTransaction();ft.replace(R.id.simple_fragment, Fragment1);ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);ft.commit();

Fragment1 onCreate

Fragment1 onCreateView

Fragment1 onStart

Fragment1 onResume

Fragment2 onPause

Fragment2 onStop

Fragment2 onDestoryView

Fragment2 onDestory

Fragment1因為已經(jīng)被回收,又走onCreate,F(xiàn)ragment2被回收。

這兩種方式顯然都不滿足我的需求,且與生命周期圖不同。因為我需要在用戶看見/看不見Fragment時register和unregister BroadcastReceiver之類的東西(onHiddenChanged也能實現(xiàn),但第一次載入顯示,以及銷毀時不會走onHiddenChanged方法),也不希望用戶回到上一個Fragment就重新創(chuàng)建整個Fragment,因為這樣消耗資源。

看了ApiDemo,發(fā)現(xiàn)也是用replace方法,但是,我少了一行:

ft.addToBackStack(null);

在replace時加上這行,可以把原來的Fragment放入棧中,走onDestoryView方法,但不會onDestory,返回時,直接onCreateView,不再onCreate. 返回直接調(diào)用popBackStack()方法:

getFragmentManager().popBackStack();

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容