Android onSaveInstanceState和onRestoreInstanceState觸發(fā)的時機(jī)
Android onSaveInstanceState和onRestoreInstanceState觸發(fā)的時機(jī)
先看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)
從這句話可以知道,當(dāng)某個activity變得“容易”被系統(tǒng)銷毀時,該activity的onSaveInstanceState就會被執(zhí)行,除非該activity是被用戶主動銷毀的,例如當(dāng)用戶按BACK鍵的時候。
注意上面的雙引號,何為“容易”?言下之意就是該activity還沒有被銷毀,而僅僅是一種可能性。這種可能性有哪些?通過重寫一個activity的所有生命周期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我們可以清楚地知道當(dāng)某個activity(假定為activity A)顯示在當(dāng)前task的最上層時,其onSaveInstanceState方法會在什么時候被執(zhí)行,有這么幾種情況:
1、當(dāng)用戶按下HOME鍵時。
這是顯而易見的,系統(tǒng)不知道你按下HOME后要運(yùn)行多少其他的程序,自然也不知道activity A是否會被銷毀,故系統(tǒng)會調(diào)用onSaveInstanceState,讓用戶有機(jī)會保存某些非永久性的數(shù)據(jù)。以下幾種情況的分析都遵循該原則
2、長按HOME鍵,選擇運(yùn)行其他的程序時。
3、按下電源按鍵(關(guān)閉屏幕顯示)時。
4、從activity A中啟動一個新的activity時。
5、屏幕方向切換時,例如從豎屏切換到橫屏?xí)r。
在屏幕切換之前,系統(tǒng)會銷毀activity A,在屏幕切換之后系統(tǒng)又會自動地創(chuàng)建activity A,所以onSaveInstanceState一定會被執(zhí)行
總而言之,onSaveInstanceState的調(diào)用遵循一個重要原則,即當(dāng)系統(tǒng)“未經(jīng)你許可”時銷毀了你的activity,則onSaveInstanceState會被系統(tǒng)調(diào)用,這是系統(tǒng)的責(zé)任,因為它必須要提供一個機(jī)會讓你保存你的數(shù)據(jù)(當(dāng)然你不保存那就隨便你了)。
至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成對的被調(diào)用的,(本人注:我昨晚調(diào)試時就發(fā)現(xiàn)原來不一定成對被調(diào)用的?。?/p>
onRestoreInstanceState被調(diào)用的前提是,activity A“確實”被系統(tǒng)銷毀了,而如果僅僅是停留在有這種可能性的情況下,則該方法不會被調(diào)用,例如,當(dāng)正在顯示activity A的時候,用戶按下HOME鍵回到主界面,然后用戶緊接著又返回到activity A,這種情況下activity A一般不會因為內(nèi)存的原因被系統(tǒng)銷毀,故activity A的onRestoreInstanceState方法不會被執(zhí)行
另外,onRestoreInstanceState的bundle參數(shù)也會傳遞到onCreate方法中,你也可以選擇在onCreate方法中做數(shù)據(jù)還原。
至于這兩個函數(shù)的使用,給出示范代碼(留意自定義代碼在調(diào)用super的前或后):
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putBoolean("MyBoolean", true);
savedInstanceState.putDouble("myDouble", 1.9);
savedInstanceState.putInt("MyInt", 1);
savedInstanceState.putString("MyString", "Welcome back to Android");
// etc.
super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
boolean myBoolean = savedInstanceState.getBoolean("MyBoolean");
double myDouble = savedInstanceState.getDouble("myDouble");
int myInt = savedInstanceState.getInt("MyInt");
String myString = savedInstanceState.getString("MyString");
}
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Android 新手引導(dǎo)蒙層效果實現(xiàn)代碼示例
本篇文章主要介紹了Android 新手引導(dǎo)蒙層效果實現(xiàn)代碼示例,具有一定的參考價值,有興趣的可以了解一下。2017-01-01
app 請求服務(wù)器json數(shù)據(jù)實例代碼
下面小編就為大家分享一篇app 請求服務(wù)器json數(shù)據(jù)實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01
Android Http協(xié)議訪問網(wǎng)絡(luò)實例(3種)
本篇文章主要介紹了Android Http協(xié)議訪問網(wǎng)絡(luò)實例(3種),具有一定的參考價值,有興趣的可以了解一下2017-07-07
Android ScrollView只能添加一個子控件問題解決方法
這篇文章主要介紹了Android ScrollView只能添加一個子控件問題解決方法,涉及Android界面布局的相關(guān)技巧,需要的朋友可以參考下2016-02-02
Android打賞功能實現(xiàn)代碼(支付寶轉(zhuǎn)賬)
這篇文章主要介紹了Android打賞功能之支付寶轉(zhuǎn)賬 ,需要的朋友可以參考下2017-12-12
android教程之使用asynctask在后臺運(yùn)行耗時任務(wù)
AsyncTask用在需要在ui線程中調(diào)用、在背景線程中執(zhí)行耗時任務(wù)、并且在ui線程中返回結(jié)果的場合。下面就是一個在背景中運(yùn)行的AsyncTask的實現(xiàn)DownloadDBTask2014-02-02
Android 實現(xiàn)關(guān)機(jī)的多種方式
有段時間做系統(tǒng)hook時需要用到系統(tǒng)重啟,找了幾種重啟的方法,還有幾種關(guān)機(jī)的方法,總結(jié)一下,有此需求的同學(xué)可以選擇適合自己的方式2021-05-05

