Android中Activity的狀態(tài)保存

以下內(nèi)容整理自互聯(lián)網(wǎng),僅用于個人學習


1. onSaveInstanceState (Bundle outState)的調(diào)用

當某個activity“即將”被系統(tǒng)銷毀時,該activity的onSaveInstanceState就會被執(zhí)行,除非該activity是被用戶主動銷毀的,例如當用戶按BACK鍵的時候。

“即將”的意思就是該activity還沒有被銷毀,而僅僅是一種可能性。這種可能性有哪些?通過重寫一個activity的所有生命周期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我們可以清楚地知道當某個activity(假定為activity A)顯示在當前task的最上層時,其onSaveInstanceState方法會在什么時候被執(zhí)行,有這么幾種情況:

  • 當用戶按下HOME鍵時。這是顯而易見的,系統(tǒng)不知道你按下HOME后要運行多少其他的程序,自然也不知道Activity A是否會被銷毀,故系統(tǒng)會調(diào)用onSaveInstanceState,讓用戶有機會保存某些非永久性的數(shù)據(jù)。以下幾種情況的分析都遵循該原則
  • 長按HOME鍵,選擇運行其他的程序時。
  • 按下電源按鍵(關閉屏幕顯示)時。
  • 從Activity A中啟動一個新的Activity時。
  • 屏幕方向切換時,例如從豎屏切換到橫屏時。在屏幕切換之前,系統(tǒng)會銷毀Activity A,在屏幕切換之后系統(tǒng)又會自動地創(chuàng)建Activity A,所以onSaveInstanceState一定會被執(zhí)行。

總而言之,onSaveInstanceState的調(diào)用遵循一個重要原則,即當系統(tǒng)“未經(jīng)你許可”時銷毀了你的activity,則onSaveInstanceState會被系統(tǒng)調(diào)用,這是系統(tǒng)的責任,因為它必須要提供一個機會讓你保存你的數(shù)據(jù)(當然你不保存那就隨便你了)。

2. onRestoreInstanceState (Bundle outState)的調(diào)用

至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成對的被調(diào)用的,onRestoreInstanceState被調(diào)用的前提是,Activity A“確實”被系統(tǒng)銷毀了,而如果僅僅是停留在有這種可能性的情況下,則該方法不會被調(diào)用,例如,當正在顯示Activity A的時候,用戶按下HOME鍵回到主界面,然后用戶緊接著又返回到Activity A,這種情況下Activity A一般不會因為內(nèi)存的原因被系統(tǒng)銷毀,故Activity A的onRestoreInstanceState方法不會被執(zhí)行。

另外,onSaveInstanceState的bundle參數(shù)也會傳遞到onCreate方法中,你也可以選擇在onCreate方法中做數(shù)據(jù)還原。

3. 各個回調(diào)函數(shù)執(zhí)行順序

如果異常關閉Activity,即調(diào)用了onSaveInstanceState,并且下次啟動時會onRestoreInstanceState:

  • onCreate
  • onStart
  • onRestoreInstanceState
  • onResume

也就是說,onRestoreInstanceState發(fā)生在onStart和onResume之間。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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