Activity的生命周期全面分析
正常情況下的生命周期
(1)針對(duì)一個(gè)特定的Activity,第一次啟動(dòng)剿牺,回調(diào)如下:onCreate->onStart->onResume企垦。
(2)當(dāng)用戶打開新的Activity或者切換到桌面的時(shí)候,回調(diào)如下:onPause->onStop晒来。這里有一個(gè)特殊情況钞诡,如果新Activity采用透明主題,那么當(dāng)前Activity不會(huì)回調(diào)onStop湃崩。
(3)當(dāng)用戶在此回到原Activity時(shí)荧降,回調(diào)如下:onRestart->onStart->onResume。
(4)當(dāng)用戶按下back鍵回退時(shí)攒读,回調(diào)如下:onPause->onStop->onDestory朵诫。
(5)當(dāng)Activity被系統(tǒng)回收后再次打開,生命周期方法回調(diào)過程和(1)一樣薄扁,注意是生命周期方法一樣剪返,不代表所有過程都一樣。
(6)從整個(gè)生命周期來說邓梅,onCreate和onDestory是配對(duì)的脱盲,分別標(biāo)識(shí)著Activity的創(chuàng)建和銷毀,并且只可能有一次調(diào)用震放。從Activity是否可見來說宾毒,onStart和onStop是配對(duì)的,隨著用戶的操作或者設(shè)備屏幕的點(diǎn)亮和熄滅殿遂,這兩個(gè)方法可能被調(diào)用多次诈铛;從Activity是否在前臺(tái)來說,onResume和onPause是配對(duì)的墨礁,隨著用戶操作或者設(shè)備屏幕的點(diǎn)亮和熄滅幢竹,這兩個(gè)方法可能被調(diào)用多次。
(7)當(dāng)前Activity為A恩静,如果這時(shí)用戶打開一個(gè)新的ActivityB焕毫,那么回調(diào)如下:A-onResume->A-onPause->B-onCreate->B-onStart->B-onResume->A-onStop蹲坷。
異常情況下生命周期
1)資源相關(guān)的系統(tǒng)配置發(fā)生改變導(dǎo)致Activity被殺死并重新創(chuàng)建
在默認(rèn)情況下,如果我們的Activity不做特殊處理邑飒,那么當(dāng)前系統(tǒng)配置發(fā)生改變后循签,Activity就會(huì)被銷毀并重新創(chuàng)建。其onPause疙咸、onStop县匠、onDestory均會(huì)被調(diào)用,同時(shí)由于Activity是在異常情況下終止的撒轮,系統(tǒng)會(huì)調(diào)用onSaveInstanceState來保存當(dāng)前Activity的狀態(tài)乞旦。這個(gè)方法的調(diào)用時(shí)機(jī)是在onStop之前,它和onPause沒有既定的時(shí)序關(guān)系题山,它既可能在onPause之前也可能在之后兰粉。這個(gè)方法只會(huì)出現(xiàn)在Activity被異常終止的情況下,正常情況下系統(tǒng)不會(huì)調(diào)用此方法顶瞳。當(dāng)Activity被重新創(chuàng)建后玖姑,系統(tǒng)會(huì)調(diào)用onRestoreInstance,并且把Activity銷毀時(shí)onSaveInstanceState方法所保存的Bundle對(duì)象作為參數(shù)同時(shí)傳遞給onRestoreInstanceState和onCreate方法浊仆。因此我們可以通過onRestoreInstanceState和onCreate方法來判斷Activity是否被重建了客峭,如果被重建了豫领,那么我們就可以取出之前保存的數(shù)據(jù)并恢復(fù)從時(shí)序上來說抡柿,onRestoreInstanceState的調(diào)用時(shí)機(jī)在onStart之后。
(2)資源內(nèi)存不足導(dǎo)致低優(yōu)先級(jí)的Activity被殺死
a等恐、前臺(tái)Activity——正在和用戶交互的Activity洲劣,優(yōu)先級(jí)最高。
b课蔬、可見但非前臺(tái)Activity——比如Activity中彈出一個(gè)對(duì)話框囱稽,導(dǎo)致Activity可見但是位于后臺(tái)無法和用戶直接交互。
c二跋、后臺(tái)Activity——已經(jīng)被暫停的Activity战惊,比如執(zhí)行了onStop,優(yōu)先級(jí)最低扎即。
可以給Activity指定configChanges屬性吞获。防止Activity重建
android:configChanges="orientation|keyboardHidden"