以下內(nèi)容整理自互聯(lián)網(wǎng)到千,僅用于個(gè)人學(xué)習(xí)
1. onSaveInstanceState (Bundle outState)的調(diào)用
當(dāng)某個(gè)activity“即將”被系統(tǒng)銷毀時(shí),該activity的onSaveInstanceState就會(huì)被執(zhí)行加矛,除非該activity是被用戶主動(dòng)銷毀的斟览,例如當(dāng)用戶按BACK鍵的時(shí)候。
“即將”的意思就是該activity還沒有被銷毀妓羊,而僅僅是一種可能性躁绸。這種可能性有哪些剥哑?通過重寫一個(gè)activity的所有生命周期的onXXX方法株婴,包括onSaveInstanceState和onRestoreInstanceState方法,我們可以清楚地知道當(dāng)某個(gè)activity(假定為activity A)顯示在當(dāng)前task的最上層時(shí)逻翁,其onSaveInstanceState方法會(huì)在什么時(shí)候被執(zhí)行,有這么幾種情況:
- 當(dāng)用戶按下HOME鍵時(shí)。這是顯而易見的乍迄,系統(tǒng)不知道你按下HOME后要運(yùn)行多少其他的程序褥伴,自然也不知道Activity A是否會(huì)被銷毀,故系統(tǒng)會(huì)調(diào)用onSaveInstanceState似踱,讓用戶有機(jī)會(huì)保存某些非永久性的數(shù)據(jù)。以下幾種情況的分析都遵循該原則
- 長(zhǎng)按HOME鍵轧简,選擇運(yùn)行其他的程序時(shí)庐橙。
- 按下電源按鍵(關(guān)閉屏幕顯示)時(shí)。
- 從Activity A中啟動(dòng)一個(gè)新的Activity時(shí)。
- 屏幕方向切換時(shí)惨寿,例如從豎屏切換到橫屏?xí)r。在屏幕切換之前蕉拢,系統(tǒng)會(huì)銷毀Activity A,在屏幕切換之后系統(tǒng)又會(huì)自動(dòng)地創(chuàng)建Activity A闸准,所以onSaveInstanceState一定會(huì)被執(zhí)行。
總而言之库快,onSaveInstanceState的調(diào)用遵循一個(gè)重要原則,即當(dāng)系統(tǒng)“未經(jīng)你許可”時(shí)銷毀了你的activity湿蛔,則onSaveInstanceState會(huì)被系統(tǒng)調(diào)用财喳,這是系統(tǒng)的責(zé)任,因?yàn)樗仨氁峁┮粋€(gè)機(jī)會(huì)讓你保存你的數(shù)據(jù)(當(dāng)然你不保存那就隨便你了)所踊。
2. onRestoreInstanceState (Bundle outState)的調(diào)用
至于onRestoreInstanceState方法误证,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成對(duì)的被調(diào)用的灌具,onRestoreInstanceState被調(diào)用的前提是缕题,Activity A“確實(shí)”被系統(tǒng)銷毀了,而如果僅僅是停留在有這種可能性的情況下宵睦,則該方法不會(huì)被調(diào)用,例如,當(dāng)正在顯示Activity A的時(shí)候郑趁,用戶按下HOME鍵回到主界面,然后用戶緊接著又返回到Activity A躲惰,這種情況下Activity A一般不會(huì)因?yàn)閮?nèi)存的原因被系統(tǒng)銷毀礁扮,故Activity A的onRestoreInstanceState方法不會(huì)被執(zhí)行逛钻。
另外,onSaveInstanceState的bundle參數(shù)也會(huì)傳遞到onCreate方法中锰提,你也可以選擇在onCreate方法中做數(shù)據(jù)還原。
3. 各個(gè)回調(diào)函數(shù)執(zhí)行順序
如果異常關(guān)閉Activity,即調(diào)用了onSaveInstanceState旺订,并且下次啟動(dòng)時(shí)會(huì)onRestoreInstanceState:
- onCreate
- onStart
- onRestoreInstanceState
- onResume
也就是說樱调,onRestoreInstanceState發(fā)生在onStart和onResume之間伙窃。