Android Activity、Fragment的生命周期

一. Activity的生命周期

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


0_1314838777He6C.gif

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的生命周期圖:


4170699_6619.png

與Activity想比較:


4170682_3824.png

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;

最后編輯于
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 啟動(dòng)與銷毀Activity 不同于使用 main() 方法啟動(dòng)應(yīng)用的其他編程范例,Android 系統(tǒng)會(huì)通過調(diào)用對(duì)...
    安卓Boy閱讀 1,885評(píng)論 3 5
  • Activity生命周期 典型生命周期 指在有用戶參與的情況下,Activity經(jīng)歷的生命周期的改變。正常情況下,...
    wangsye閱讀 1,468評(píng)論 0 0
  • 那一世舉案齊眉,你吟詩(shī),我研墨,后來隨你瓜田李下,你種瓜,我點(diǎn)豆。 那一世策馬奔騰,陪你浪跡天涯海角,后來蝸居陋室...
    風(fēng)鈴兒聲聲閱讀 404評(píng)論 6 2
  • 他:我來生想做一只狗她:為什么是想做狗呢?他:沉默不語她:那我來生也要做狗,我本來就屬狗他:好啊 我當(dāng)看門狗,...
    兩顆木芯閱讀 422評(píng)論 0 0
  • Day 080 2016-6-24《生活時(shí)代的材料作文》閱讀下面的文字,根據(jù)要求作文。醉心于古文化研究的英國(guó)歷史學(xué)...
    宇楓Sai閱讀 432評(píng)論 0 2

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