二.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ì)