保存现场数据和状态:onSaveInstanceState\onRestoreInstanceState\onCreate()
當(dāng)某個(gè)activity變得“容易”被系統(tǒng)銷毀時(shí),該activity的onSaveInstanceState就會(huì)被執(zhí)行,除非該activity是被用戶主動(dòng)銷毀的,例如當(dāng)用戶按BACK鍵的時(shí)候。?
注意上面的雙引號(hào),何為“容易”?言下之意就是該activity還沒有被銷毀,而僅僅是一種可能性。這種可能性有哪些?通過重寫一個(gè)activity的所有生命周期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我們可以清楚地知道當(dāng)某個(gè)activity(假定為activity A)顯示在當(dāng)前task的最上層時(shí),其onSaveInstanceState方法會(huì)在什么時(shí)候被執(zhí)行,有這么幾種情況:?
1、當(dāng)用戶按下HOME鍵時(shí)。?
這是顯而易見的,系統(tǒng)不知道你按下HOME后要運(yùn)行多少其他的程序,自然也不知道activity A是否會(huì)被銷毀,故系統(tǒng)會(huì)調(diào)用onSaveInstanceState,讓用戶有機(jī)會(huì)保存某些非永久性的數(shù)據(jù)。以下幾種情況的分析都遵循該原則?
2、長(zhǎng)按HOME鍵,選擇運(yùn)行其他的程序時(shí)。?
3、按下電源按鍵(關(guān)閉屏幕顯示)時(shí)。?
4、從activity A中啟動(dòng)一個(gè)新的activity時(shí)。?
5、屏幕方向切換時(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)然你不保存那就隨便你了)。
//可以在此保存現(xiàn)場(chǎng)數(shù)據(jù),Bundle實(shí)際上相當(dāng)于一個(gè)map使用,保存key-value,可以持久化到數(shù)據(jù)庫或者文件,在onCreate方法中做數(shù)據(jù)還原
@Override
protected void onSaveInstanceState(Bundle outState)
{
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
outState.putString("name", "sea");
outState.putString("loginFlag", "yes");
Log.e("onSaveInstanceState", "onSaveInstanceState方法執(zhí)行了") ;
System.out.println("onSaveInstanceState方法執(zhí)行了2");
}
?
至于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í)行。?
另外,onRestoreInstanceState的bundle參數(shù)也會(huì)傳遞到onCreate方法中,你也可以選擇在onCreate方法中做數(shù)據(jù)還原。?
protected void onRestoreInstanceState(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
}
理解: 個(gè)人認(rèn)為anroid框架應(yīng)該是通過設(shè)置了一個(gè)靜態(tài)變量開辟全局內(nèi)存,讓各個(gè)方法共享設(shè)置Bundle?參數(shù)與取用(僅代表個(gè)人推測(cè)觀點(diǎn))
轉(zhuǎn)載于:https://www.cnblogs.com/sea520/p/4575625.html
總結(jié)
以上是生活随笔為你收集整理的保存现场数据和状态:onSaveInstanceState\onRestoreInstanceState\onCreate()的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c/c++与java------之JNI
- 下一篇: Convolutional Neural