Fragment生命周期探討

二.Fragment生命周期探討


下面來分析Fragment生命周期:

onAttach(Activity):當(dāng)Fragment與Activity發(fā)生關(guān)聯(lián)時(shí)調(diào)用。

onCreateView(LayoutInflater, ViewGroup,Bundle):創(chuàng)建該Fragment的視圖

onActivityCreated(Bundle):當(dāng)Activity的onCreate方法返回時(shí)調(diào)用

onDestoryView():與onCreateView想對(duì)應(yīng),當(dāng)該Fragment的視圖被移除時(shí)調(diào)用

onDetach():與onAttach相對(duì)應(yīng),當(dāng)Fragment與Activity關(guān)聯(lián)被取消時(shí)調(diào)用,也就是Fragment的創(chuàng)建與刪除過程都是先鏈接(Attach)到Avtivity,再創(chuàng)建視圖(View)

注意:除了onCreateView,其他的所有方法如果你重寫了,必須調(diào)用父類對(duì)于該方法的實(shí)現(xiàn)

3.Fragment的三個(gè)常用類

android.app.Fragment 主要用于定義Fragment

android.app.FragmentManager 主要用于在Activity中操作Fragment

android.app.FragmentTransaction 對(duì)Fragment進(jìn)行增加刪除等操作

a.得到Fragment

getFragmentManager() // v4中,getSupportFragmentManager

b.使用FragmentTransaction 操作Fragment的基本用法

transaction.add()

往Activity中添加一個(gè)Fragment

transaction.remove()

從Activity中移除一個(gè)Fragment,如果被移除的Fragment沒有添加到回退棧,這個(gè)Fragment實(shí)例將會(huì)被銷毀。

transaction.replace()

使用另一個(gè)Fragment替換當(dāng)前的,實(shí)際上就是remove()然后add()的合體

transaction.hide()

隱藏當(dāng)前的Fragment,僅僅是設(shè)為不可見,并不會(huì)銷毀

transaction.show()

顯示之前隱藏的Fragment

detach()

會(huì)將view從UI中移除,和remove()不同,此時(shí)fragment的狀態(tài)依然由FragmentManager維護(hù)。

attach()

重建view視圖,附加到UI上并顯示。

transatcion.commit()//提交一個(gè)事務(wù),若進(jìn)行保存數(shù)據(jù)操作,一定要在Activity.onSaveInstance()

上述,基本是操作Fragment的所有的方式了,在一個(gè)事務(wù)開啟到提交可以進(jìn)行多個(gè)的添加、移除、替換等操作

4.Fragment的使用

1.靜態(tài)的使用

注意:Android:name=“..............” Activity與fragment綁定


2.動(dòng)態(tài)的使用

1.配置Fragment的xml

2.繼續(xù)添加fragment_two 和fragment_three的XML,內(nèi)容和一一樣就不寫了。

3.編譯主活動(dòng)頁activity_main.xml

? ? 注意:此處是FrameLayout標(biāo)簽

4.下面編寫fragment展示頁代碼部分

public class Fragment_Oneextends Fragment implements View.OnClickListener{

? ? private Buttonbutton;

? ? private final StringTAG ="zyl";

//配置監(jiān)聽按鈕

? ? public interface FOneBtnListener{

????????????void onFOneBtnClick();

? ? }

@Nullable

@Override

? ? public ViewonCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

????????Log.d(TAG, "onCreateView: ");

? ? ? ? View view = inflater.inflate(R.layout.item, container, false);

? ? ? ? button = view.findViewById(R.id.bt_fragment);

? ? ? ? button.setOnClickListener(this);

? ? ? ? return view;

? ? }

@Override

?? public void onClick(View v) {

//若實(shí)現(xiàn)了這個(gè)接口,就可以用,把事件交給Activity來做

? ? ? ? if (getActivity()instanceof FOneBtnListener) {

((FOneBtnListener) getActivity()).onFOneBtnClick();

? ? ? ? }

}

@Override

? ? public void onAttach(Context context) {

super.onAttach(context);

? ? ? ? Log.d(TAG, "onAttach1: ");

? ? }

}

到此動(dòng)態(tài)添加Activity就結(jié)束了,關(guān)于如果解決Fragment頁面旋轉(zhuǎn)重疊參考實(shí)踐(一)| (解決重疊問題)

三. Fragment生命周期分析:

1. 當(dāng)一個(gè)fragment被創(chuàng)建的時(shí)候,它會(huì)經(jīng)歷以下狀態(tài).

onAttach()

onCreate()

onCreateView()

onActivityCreated()

2. 當(dāng)這個(gè)fragment對(duì)用戶可見的時(shí)候,它會(huì)經(jīng)歷以下狀態(tài)。

onStart()

onResume()

3. 當(dāng)這個(gè)fragment進(jìn)入“后臺(tái)模式”的時(shí)候,它會(huì)經(jīng)歷以下狀態(tài)。

onPause()

onStop()

4. 當(dāng)這個(gè)fragment被銷毀了(或者持有它的activity被銷毀了),它會(huì)經(jīng)歷以下狀態(tài)。

onPause()

onStop()

onDestroyView()

onDestroy() // 本來漏掉類這個(gè)回調(diào),感謝xiangxue336提出。

onDetach()

5. 就像activitie一樣,在以下的狀態(tài)中,可以使用Bundle對(duì)象保存一個(gè)fragment的對(duì)象。

onCreate()

onCreateView()

onActivityCreated()

6. fragments的大部分狀態(tài)都和activitie很相似,但fragment有一些新的狀態(tài)。

onAttached() —— 當(dāng)fragment被加入到activity時(shí)調(diào)用(在這個(gè)方法中可以獲得所在的activity)。

onCreateView() —— 當(dāng)activity要得到fragment的layout時(shí),調(diào)用此方法,fragment在其中創(chuàng)建自己的layout(界面)。

onActivityCreated() —— 當(dāng)activity的onCreated()方法返回后調(diào)用此方法

onDestroyView() —— 當(dāng)fragment中的視圖被移除的時(shí)候,調(diào)用這個(gè)方法。

onDetach() —— 當(dāng)fragment和activity分離的時(shí)候,調(diào)用這個(gè)方法。

一旦activity進(jìn)入resumed狀態(tài)(也就是running狀態(tài)),你就可以自由地添加和刪除fragment了。因此,只有當(dāng)activity在resumed狀態(tài)時(shí),fragment的生命周期才能獨(dú)立的運(yùn)轉(zhuǎn),其它時(shí)候是依賴于activity的生命周期變化的。

Activity生命周期分析:

上面7個(gè)生命周期方法分別在4個(gè)階段按著一定的順序進(jìn)行調(diào)用,這4個(gè)階段如下:

?開始Activity:在這個(gè)階段依次執(zhí)行3個(gè)生命周期方法:onCreate、onStart和onResume。

?Activity失去焦點(diǎn):如果在Activity獲得焦點(diǎn)的情況下進(jìn)入其他的Activity或應(yīng)用程序,這時(shí)當(dāng)前的Activity會(huì)失去焦點(diǎn)。在這一階段,會(huì)依次執(zhí)行onPause和onStop方法。

Activity重新獲得焦點(diǎn):如果Activity重新獲得焦點(diǎn),會(huì)依次執(zhí)行3個(gè)生命周期方法:onRestart、onStart和onResume。

?關(guān)閉Activity:當(dāng)Activity被關(guān)閉時(shí)系統(tǒng)會(huì)依次執(zhí)行3個(gè)生命周期方法:onPause、onStop和onDestroy。

如果在這4個(gè)階段執(zhí)行生命周期方法的過程中不發(fā)生狀態(tài)的改變,那么系統(tǒng)會(huì)按著上面的描述依次執(zhí)行這4個(gè)階段中的生命周期方法,但如果在執(zhí)行的過程中改變了狀態(tài),系統(tǒng)會(huì)按著更復(fù)雜的方式調(diào)用生命周期方法。

在執(zhí)行的過程中可以改變系統(tǒng)的執(zhí)行軌跡的生命周期方法是onPause和onStop。如果在執(zhí)行onPause方法的過程中Activity重新獲得了焦點(diǎn),然后又失去了焦點(diǎn)。系統(tǒng)將不會(huì)再執(zhí)行onStop方法,而是按著如下的順序執(zhí)行相應(yīng)的生命周期方法:

onPause?->?onResume->?onPause

如果在執(zhí)行onStop方法的過程中Activity重新獲得了焦點(diǎn),然后又失去了焦點(diǎn)。系統(tǒng)將不會(huì)執(zhí)行onDestroy方法,而是按著如下的順序執(zhí)行相應(yīng)的生命周期方法:

onStop?->?onRestart?->?onStart?->?onResume?->?onPause?->?onStop

?在圖2所示的Activity生命周期里可以看出,系統(tǒng)在終止應(yīng)用程序進(jìn)程時(shí)會(huì)調(diào)用onPause、onStop和onDesktroy方法。而onPause方法排在了最前面,也就是說,Activity在失去焦點(diǎn)時(shí)就可能被終止進(jìn)程,而onStop和onDestroy方法可能沒有機(jī)會(huì)執(zhí)行。因此,應(yīng)該在onPause方法中保存當(dāng)前Activity狀態(tài),這樣才能保證在任何時(shí)候終止進(jìn)程時(shí)都可以執(zhí)行保存Activity狀態(tài)的代碼。

https://cloud.tencent.com/developer/article/1179432 ? //Fragment全解析系列(二):正確的使用姿勢(shì)

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

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