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

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

與Activity想比較:

1.Fragment生命周期方法:
(1)onAttach:onAttach()回調(diào)將在Fragment與其Activity關(guān)聯(lián)之后調(diào)用。需要使用Activity的引用或者使用Activity作為其他操作的上下文,將在此回調(diào)方法中實(shí)現(xiàn)。
需要注意的是:將Fragment附加到Activity以后,就無法再次調(diào)用setArguments()——除了在最開始,無法向初始化參數(shù)添加內(nèi)容。
(2)onCreate(Bundle savedInstanceState):此時(shí)的Fragment的onCreate回調(diào)時(shí),該fragment還沒有獲得Activity的onCreate()已完成的通知,所以不能將依賴于Activity視圖層次結(jié)構(gòu)存在性的代碼放入此回調(diào)方法中。在onCreate()回調(diào)方法中,我們應(yīng)該盡量避免耗時(shí)操作。此時(shí)的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)會(huì)自動(dòng)完成。如果在此回調(diào)中將碎片的視圖層次結(jié)構(gòu)附加到父元素,很可能會(huì)出現(xiàn)異常。
這句話什么意思呢?就是不要把初始化的view視圖主動(dòng)添加到container里面,以為這會(huì)系統(tǒng)自帶,所以inflate函數(shù)的第三個(gè)參數(shù)必須填false,而且不能出現(xiàn)container.addView(v)的操作。
View v = inflater.inflate(R.layout.hello_world, container, false);
(4)onActivityCreated:onActivityCreated()回調(diào)會(huì)在Activity完成其onCreate()回調(diào)之后調(diào)用。在調(diào)用onActivityCreated()之前,Activity的視圖層次結(jié)構(gòu)已經(jīng)準(zhǔn)備好了,這是在用戶看到用戶界面之前你可對(duì)用戶界面執(zhí)行的最后調(diào)整的地方。
強(qiáng)調(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)方法進(jìn)行綁定,也就是說與Activity中對(duì)應(yīng)的生命周期相同,因此不做過多介紹。
(6)onDestroyView:該回調(diào)方法在視圖層次結(jié)構(gòu)與Fragment分離之后調(diào)用。
(7)onDestroy:不再使用Fragment時(shí)調(diào)用。(備注:Fragment仍然附加到Activity并任然可以找到,但是不能執(zhí)行其他操作)
(8)onDetach:Fragme生命周期最后回調(diào)函數(shù),調(diào)用后,F(xiàn)ragment不再與Activity綁定,釋放資源。
2.場(chǎng)景演示 :
切換到該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;