下面這張F(tuán)ragment生命周期圖大家應(yīng)該看得很多了:
但最近在寫PageManager(管理頁面跳轉(zhuǎn)),發(fā)現(xiàn)切換頁面時(shí),之前的頁面走完onDestoryView就直接onDestory了,回來又重新onCreate,如果用hide和show的方式,都不走生命周期,看了ApiDemo代碼,發(fā)現(xiàn)原因,整理一下.
切換Fragment有兩種方式,一種是add新的,并把舊的hide,另一種是replace.
舊的Fragment為Fragment1,新的是Fragment2,忽略非關(guān)鍵生命周期。
使用add方法切換時(shí):
載入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不走任何生命周期,但會(huì)調(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在隱藏時(shí)并不會(huì)走onDestoryView,所以顯示時(shí)也不會(huì)走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
真實(shí)打印出來可能是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因?yàn)橐呀?jīng)被回收,又走onCreate,F(xiàn)ragment2被回收。
這兩種方式顯然都不滿足我的需求,且與生命周期圖不同。因?yàn)槲倚枰谟脩艨匆?看不見Fragment時(shí)register和unregister BroadcastReceiver之類的東西(onHiddenChanged也能實(shí)現(xiàn),但第一次載入顯示,以及銷毀時(shí)不會(huì)走onHiddenChanged方法),也不希望用戶回到上一個(gè)Fragment就重新創(chuàng)建整個(gè)Fragment,因?yàn)檫@樣消耗資源。
看了ApiDemo,發(fā)現(xiàn)也是用replace方法,但是,我少了一行:
ft.addToBackStack(null);
在replace時(shí)加上這行,可以把原來的Fragment放入棧中,走onDestoryView方法,但不會(huì)onDestory,返回時(shí),直接onCreateView,不再onCreate. 返回直接調(diào)用popBackStack()方法:
getFragmentManager().popBackStack();