onSaveInstanceState和onRestoreInstanceState觸發的時機

先看Application Fundamentals上的一段話:

 

 Android calls onSaveInstanceState() before the activity becomes vulnerable to being destroyed by the system, but does not bother calling it when the instance is actually being destroyed by a user action (such as pressing the BACK key)

 

從這句話可以知道,當某個activity變得“容易”被系統銷燬時,該activity的onSaveInstanceState就會被執行,除非該activity是被用戶主動銷燬的,例如當用戶按BACK鍵的時候。

注意上面的雙引號,何爲“容易”?言下之意就是該activity還沒有被銷燬,而僅僅是一種可能性。這種可能性有哪些?通過重寫一個activity的所有生命週期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我們可以清楚地知道當某個activity(假定爲activity A)顯示在當前task的最上層時,其onSaveInstanceState方法會在什麼時候被執行,有這麼幾種情況:


1、當用戶按下HOME鍵時。

這是顯而易見的,系統不知道你按下HOME後要運行多少其他的程序,自然也不知道activity A是否會被銷燬,故系統會調用onSaveInstanceState,讓用戶有機會保存某些非永久性的數據。以下幾種情況的分析都遵循該原則


2、長按HOME鍵,選擇運行其他的程序時。


3、按下電源按鍵(關閉屏幕顯示)時。


4、從activity A中啓動一個新的activity時。


5、屏幕方向切換時,例如從豎屏切換到橫屏時。

在屏幕切換之前,系統會銷燬activity A,在屏幕切換之後系統又會自動地創建activity A,所以onSaveInstanceState一定會被執行

 

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

 


至於onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成對的被調用的,onRestoreInstanceState被調用的前提是,activity A“確實”被系統銷燬了,而如果僅僅是停留在有這種可能性的情況下,則該方法不會被調用,例如,當正在顯示activity A的時候,用戶按下HOME鍵回到主界面,然後用戶緊接着又返回到activity A,這種情況下activity A一般不會因爲內存的原因被系統銷燬,故activity A的onRestoreInstanceState方法不會被執行


另外,onRestoreInstanceState的bundle參數也會傳遞到onCreate方法中,你也可以選擇在onCreate方法中做數據還原


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章