一. Activity的生命周期
下面先上Activity的生命周期圖:

1.Activity生命周期方法:
(1)onCreate:表示Activity正在被創(chuàng)建,在這里可以做一些初始化的工作;
(2)onRestart:表示Activity正在重新啟動,當(dāng)當(dāng)前Activity從不可見切換到可見的狀態(tài)時會被調(diào)用;
(3)onStart:表示Activity正在被啟動,這時Activity已可見,但還沒出現(xiàn)在前臺;
(4)onResume:表示Activity已經(jīng)可見,可與用戶進行交互;
(5)onPause:表示Activity正在停止,正常情況下緊接著onStop方法就會被調(diào)用。但在特殊的情況下,如果這個時候快速地返回當(dāng)前的Activity,那么onResume方法會被調(diào)用??梢栽谶@個方法里面做一些存儲數(shù)據(jù)、停止動畫的操作,但不能太耗時,因為只有執(zhí)行完這個方法后新的Activity的onResume方法才會被執(zhí)行;
(6)onStop:表示Activity即將停止,可以做一些重量級的回收工作,同樣不能太耗時;
(7)onDestroy:表示Activity即將被銷毀,可以做一些回收工作以及最終資源的釋放。
2.Activity生命周期的一些場景:
(1)第一次啟動:onCreate -> onStart -> onResume;
(2)當(dāng)用戶打開新的Activity或者切換到桌面時:onPause -> onStop;
注:假如當(dāng)前的主題是透明的,則只回調(diào)onPause方法。
(3)再次切換回到當(dāng)前Activity:onRestart -> onStart -> onResume;
(4)當(dāng)用戶按back鍵回退時:onPause -> onStop -> onDestroy;
下面順帶介紹一下Activity的四種啟動模式:
3.Activity的啟動模式:
(1)standard:標(biāo)準(zhǔn)模式,系統(tǒng)的默認(rèn)模式。每次啟動都重新創(chuàng)建一個實例,不管實例是否存在。
(2)singleTop:棧頂復(fù)用模式。在這種模式下,如果新Activity已經(jīng)位于任務(wù)棧的棧頂,那么此Activity不會被重新創(chuàng)建,同時它的onNewIntent方法會被回調(diào),通過此方法的參數(shù)可以取出當(dāng)前請求的信息。
(3)singleTask:棧內(nèi)復(fù)用模式。是一種單例模式。
1) 棧S1為ABC,D需要的任務(wù)棧為S2,由于S2和D均不存在,所以先創(chuàng)建S2,再創(chuàng)建D的實例并將其入棧S2;
2) 棧S1為ABC,D需要的任務(wù)棧為S1,直接創(chuàng)建D的實例并將其入棧到S1;
3) 棧S1為ADBC,D需要的任務(wù)棧為S1,切換D到棧頂,D上面的全部出棧,最終S1為AD;
(4)singleInstance:單實例模式。singleTask的加強版,此種模式的Activity只能單獨的位于一個任務(wù)棧中。
二.Fragment的生命周期
下面先上Fragment的生命周期圖:

與Activity想比較:

1.Fragment生命周期方法:
(1)onAttach:onAttach()回調(diào)將在Fragment與其Activity關(guān)聯(lián)之后調(diào)用。需要使用Activity的引用或者使用Activity作為其他操作的上下文,將在此回調(diào)方法中實現(xiàn)。
需要注意的是:將Fragment附加到Activity以后,就無法再次調(diào)用setArguments()——除了在最開始,無法向初始化參數(shù)添加內(nèi)容。
(2)onCreate(Bundle savedInstanceState):此時的Fragment的onCreate回調(diào)時,該fragment還沒有獲得Activity的onCreate()已完成的通知,所以不能將依賴于Activity視圖層次結(jié)構(gòu)存在性的代碼放入此回調(diào)方法中。在onCreate()回調(diào)方法中,我們應(yīng)該盡量避免耗時操作。此時的bundle就可以獲取到activity傳來的參數(shù)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle args = getArguments();
if (args != null) {
mLabel = args.getCharSequence("label", mLabel);
}
}
(3)onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState): 其中的Bundle為狀態(tài)包與上面的bundle不一樣。
注意的是:不要將視圖層次結(jié)構(gòu)附加到傳入的ViewGroup父元素中,該關(guān)聯(lián)會自動完成。如果在此回調(diào)中將碎片的視圖層次結(jié)構(gòu)附加到父元素,很可能會出現(xiàn)異常。
這句話什么意思呢?就是不要把初始化的view視圖主動添加到container里面,以為這會系統(tǒng)自帶,所以inflate函數(shù)的第三個參數(shù)必須填false,而且不能出現(xiàn)container.addView(v)的操作。
View v = inflater.inflate(R.layout.hello_world, container, false);
(4)onActivityCreated:onActivityCreated()回調(diào)會在Activity完成其onCreate()回調(diào)之后調(diào)用。在調(diào)用onActivityCreated()之前,Activity的視圖層次結(jié)構(gòu)已經(jīng)準(zhǔn)備好了,這是在用戶看到用戶界面之前你可對用戶界面執(zhí)行的最后調(diào)整的地方。
強調(diào)的point:如果Activity和她的Fragment是從保存的狀態(tài)重新創(chuàng)建的,此回調(diào)尤其重要,也可以在這里確保此Activity的其他所有Fragment已經(jīng)附加到該Activity中了
(5)Fragment與Activity相同生命周期調(diào)用:接下來的onStart()\onResume()\onPause()\onStop()回調(diào)方法將和Activity的回調(diào)方法進行綁定,也就是說與Activity中對應(yīng)的生命周期相同,因此不做過多介紹。
(6)onDestroyView:該回調(diào)方法在視圖層次結(jié)構(gòu)與Fragment分離之后調(diào)用。
(7)onDestroy:不再使用Fragment時調(diào)用。(備注:Fragment仍然附加到Activity并任然可以找到,但是不能執(zhí)行其他操作)
(8)onDetach:Fragme生命周期最后回調(diào)函數(shù),調(diào)用后,F(xiàn)ragment不再與Activity綁定,釋放資源。
2.場景演示 :
切換到該Fragment:onAttach -> onCreate -> onCreateView -> onActivityCreated -> onStart -> onResume;
屏幕滅掉:onPause -> onSaveInstanceState-> onStop;
屏幕解鎖:onStart -> onResume;
切換到其他Fragment:onPause -> onStop -> onDestroyView;
切換回本身的Fragment:onCreateView -> onActivityCreated -> onStart -> onResume;
回到桌面:onPause -> onSaveInstanceState -> onStop;
回到應(yīng)用:onStart -> onResume;
退出應(yīng)用:onPause -> onStop -> onDestroyView -> onDestroy -> onDetach;