Android中Fragment的生命周期與返回棧的管理
既然我們已經(jīng)知道了Fragment很好用,那么我們也需要知道它的工作原理。Fragment只能存在于(作為容器的)Activity中,每一個(gè)Fragment都有自己的視圖結(jié)構(gòu),可以像我們之前那樣載入布局。Fragment的生命周期更加復(fù)雜,因?yàn)樗懈嗟臓顟B(tài),如圖:

我們來看一下Fragment完整的生命周期。
在Fragment生命周期開始,onInflate方法被調(diào)用。要注意的是,這個(gè)方法只在我們直接用標(biāo)簽在布局文件中定義的時(shí)候才會(huì)被調(diào)用。我們可以在這個(gè)方法中保存一些在xml布局文件中定義的配置參數(shù)和一些屬性。
這一步過后就輪到onAttach被調(diào)用了。這個(gè)方法在Fragment綁定到它的父Activity中的時(shí)候被調(diào)用,我們可以在這里保存它和Activity之間的引用。
之后onCreate會(huì)被調(diào)用。這是最重要的步驟之一。Fragment就是在這一步中產(chǎn)生的,可以用這個(gè)方法來啟動(dòng)其它線程來檢索數(shù)據(jù),比如從遠(yuǎn)程服務(wù)器中啟動(dòng)。
onCreateView這個(gè)方法是在Fragment創(chuàng)建自己的視圖結(jié)構(gòu)的時(shí)候被調(diào)用,在這個(gè)方法中我們會(huì)載入Fragment的布局文件,就像我們?cè)贚istView控件中載入布局一樣。在這個(gè)過程中,我們不能保證父Activity是否已經(jīng)創(chuàng)建,所以有一些操作我們不能在這里完成。
可以看到,在onActivityCreated后Activity才算是建立完成。到這一步,我們的Activity就創(chuàng)建成功并激活了。我們可以隨時(shí)使用它了。
下一步就是onStart了,在這里我們做的事和Activity中的onStart一樣,在這個(gè)方法中Fragment雖然可以顯示,但是還不能和用戶進(jìn)行交互,只有在onResume后Fragment才能開始和用戶進(jìn)行交互操作。在這個(gè)過程后,F(xiàn)ragment就已經(jīng)啟動(dòng)并運(yùn)行起來了。
也許會(huì)暫停Activity。Activity的OnPause方法會(huì)被調(diào)用。這時(shí)候Fragment的onPause方法也會(huì)被調(diào)用。
系統(tǒng)也可能會(huì)銷毀Fragment的視圖顯示,發(fā)生這種情況時(shí)onDestroyView方法就被調(diào)用了。
之后,如果系統(tǒng)需要完全銷毀整個(gè)Fragment的話,onDestroy方法就會(huì)被調(diào)用了。這時(shí)候我們就需要釋放掉所有可用的連接了,因?yàn)檫@個(gè)時(shí)候Fragment馬上就要被殺掉了。雖然是在準(zhǔn)備銷毀的過程中,但是Fragment仍然綁定在父Activity中。
最后一步就是把Fragment從Activity中解綁,即調(diào)用onDetach方法。
Fragment返回棧的管理
將Fragment添加到返回棧中:
假設(shè)現(xiàn)在我們有兩個(gè)Fragment:Fragment01和Fragment02,我們現(xiàn)在從Fragment01的界面跳到 Fragment02,然后按Back鍵,發(fā)現(xiàn)程序是直接退出了,而不是返回到Fragment01。如果現(xiàn)在想實(shí)現(xiàn)以下功能:從Fragment01的 界面跳到Fragment02,然后按Back鍵,會(huì)返回到Fragment01。這個(gè)功能該怎么實(shí)現(xiàn)呢?這其實(shí)就利用到了返回棧的知識(shí)。
其實(shí)很簡(jiǎn)單,F(xiàn)ragmentTransaction中提供了一個(gè)addToBackStack()方法,可以將一個(gè)事務(wù)添加到返回棧中。
我們這里在一段動(dòng)態(tài)加載Fragment的代碼基礎(chǔ)之上,增加一行代碼就可以將Fragment添加到返回棧中:
//步驟一:添加一個(gè)FragmentTransaction的實(shí)例 FragmentTransaction transaction = getFragmentManager().beginTransaction(); //步驟二:用add()方法加上Fragment的對(duì)象 RightFragment rightFragment = new RightFragment(); transaction.add(R.id.right, rightFragment); transaction.addToBackStack(null); //步驟三:調(diào)用commit()方法使得FragmentTransaction實(shí)例的改變生效 transaction.commit();
我們?cè)谑聞?wù)提交之前調(diào)用了FragmentTransaction的addToBackStack()方法,它可以接受一個(gè)名字用于描述返回棧的狀態(tài),一般傳入null即可。
例子
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
transaction = manager.beginTransaction(); 47 switch (v.getId()) {
case R.id.button1:
Fragment01 fragment01 = new Fragment01();
transaction.replace(R.id.right, fragment01, "fragment01");
transaction.addToBackStack("fragment01");// 添加到Activity管理的回退棧中。
break;
case R.id.button2:
Fragment02 fragment02 = new Fragment02();
transaction.replace(R.id.right, fragment02, "fragment02");
transaction.addToBackStack("fragment02");// 添加到Activity管理的回退棧中。
break;
case R.id.button3:
Fragment03 fragment03 = new Fragment03();
transaction.replace(R.id.right, fragment03, "fragment03");
transaction.addToBackStack("fragment03");// 添加到Activity管理的回退棧中。
break;
}
transaction.commit();
}
運(yùn)行程序后,界面如下,沒有任何fragment被加載:
點(diǎn)擊按鈕加載fragment01:

點(diǎn)擊按鈕加載fragment02(此時(shí)fragment01被替換,并被壓到了棧當(dāng)中):

注:如果fragment01在替換的時(shí)候沒有被壓到棧中,那就會(huì)被銷毀,在執(zhí)行完onDestroyView()方法后,會(huì)繼續(xù)執(zhí)行onDestroy()和onDetach()方法。
按Back鍵,fragment01重新返回到屏幕:(fragment02被銷毀)

再按Back鍵,fragment01被銷毀:

注:Fragment的返回棧由Activity管理;而Activity的返回棧由系統(tǒng)管理。
- Android中使用DialogFragment編寫對(duì)話框的實(shí)例教程
- Android應(yīng)用UI開發(fā)中Fragment的常見用法小結(jié)
- 深入淺析Android Fragment(下篇)
- 深入淺析 Android Fragment(上篇)
- Android App中ViewPager與Fragment結(jié)合的一些問題解決
- Android中Fragment與Activity的生命周期對(duì)比
- Android 中 Fragment的使用大全
- Android中使用TabHost 與 Fragment 制作頁面切換效果
- Android Fragment的使用方法(翻譯)
- 詳解Android應(yīng)用中DialogFragment的基本用法
相關(guān)文章
Android中通過AsyncTask類來制作炫酷進(jìn)度條的實(shí)例教程
這篇文章主要介紹了Android中通過AsyncTask來制作炫酷進(jìn)度條的實(shí)例教程,借助AsyncTask類的線程操作方法來管理異步任務(wù),需要的朋友可以參考下2016-05-05
詳解Android的Splash啟動(dòng)圖的兩種動(dòng)態(tài)切換方式
本篇文章主要介紹了詳解Android的Splash啟動(dòng)圖的兩種動(dòng)態(tài)切換方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
Android使用AudioRecord實(shí)現(xiàn)暫停錄音功能實(shí)例代碼
本篇文章主要介紹了Android使用AudioRecord實(shí)現(xiàn)暫停錄音功能實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-06-06
Android Webview滑進(jìn)出屏幕閃爍的解決方法
這篇文章主要給大家介紹了關(guān)于Android Webview滑進(jìn)出屏幕閃爍的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
Android開發(fā)使用json實(shí)現(xiàn)服務(wù)器與客戶端數(shù)據(jù)的交互功能示例
這篇文章主要介紹了Android開發(fā)使用json實(shí)現(xiàn)服務(wù)器與客戶端數(shù)據(jù)的交互功能,結(jié)合具體實(shí)例形式分析了Android使用json格式數(shù)據(jù)在服務(wù)器與客戶端傳遞實(shí)現(xiàn)數(shù)據(jù)庫(kù)查詢功能的步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
Android獲取雙卡雙待手機(jī)的SIM卡信息示例代碼
這篇文章主要給大家介紹了關(guān)于Android獲取雙卡雙待手機(jī)的SIM卡信息的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
Flutter 狀態(tài)管理的實(shí)現(xiàn)
這篇文章主要介紹了Flutter 狀態(tài)管理的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
利用百度地圖Android sdk高仿微信發(fā)送位置功能及遇到的問題
這篇文章給大家介紹了利用百度地圖Android sdk高仿微信發(fā)送位置功能,在實(shí)現(xiàn)此功能的時(shí)候遇到點(diǎn)小問題,下面小編給大家列出來,需要的朋友參考下吧2017-12-12
簡(jiǎn)單掌握Android Widget桌面小部件的創(chuàng)建步驟
這篇文章主要介紹了簡(jiǎn)單掌握Android Widget桌面小部件的創(chuàng)建步驟,Widget一般采用web前端技術(shù)進(jìn)行開發(fā),需要的朋友可以參考下2016-03-03

