一、onSaveInstanceState (Bundle outState)保存狀態(tài)
Activity中的onSaveInstanceState()回調(diào)方法用于保存臨時(shí)數(shù)據(jù)和狀態(tài),這個(gè)方法會(huì)在活動(dòng)被回收之前調(diào)用。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Acivity第一次被創(chuàng)建的時(shí)候?yàn)榭?,所以需要判斷空操? if( savedInstanceState != null ){
savedInstanceState.getString("test");
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("test","Android");
}
onSaveInstanceState方法會(huì)在以下情況下執(zhí)行:
1、當(dāng)用戶按下HOME鍵時(shí)。
2、長(zhǎng)按HOME鍵,選擇運(yùn)行其他的程序時(shí)。
3、關(guān)閉屏幕顯示時(shí)。
4、從activity A中啟動(dòng)一個(gè)新的activity時(shí)。
5、屏幕方向切換時(shí)
使用onSaveInstanceState方法需要注意的幾點(diǎn):
1.布局中的每一個(gè)View默認(rèn)實(shí)現(xiàn)了onSaveInstanceState()方法,這樣的話,這個(gè)UI的任何改變都會(huì)自動(dòng)地存儲(chǔ)和在activity重新創(chuàng)建的時(shí)候自動(dòng)地恢復(fù)。但是這種情況只有在你為這個(gè)UI提供了唯一的ID之后才起作用,如果沒有提供ID,app將不會(huì)存儲(chǔ)它的狀態(tài)。
2.由于默認(rèn)的onSaveInstanceState()方法的實(shí)現(xiàn)幫助UI存儲(chǔ)它的狀態(tài),所以如果需要覆蓋這個(gè)方法去存儲(chǔ)額外的狀態(tài)信息,應(yīng)該在執(zhí)行任何代碼之前都調(diào)用父類的onSaveInstanceState()方法(super.onSaveInstanceState())。 如果自己的派生類中有變量影響到UI,或你程序的行為,就要把這個(gè)變量也保存了,那么就需要自己實(shí)現(xiàn),否則就不需要。
3.由于onSaveInstanceState()方法調(diào)用的不確定性,應(yīng)該只使用這個(gè)方法去記錄activity的瞬間狀態(tài)(UI的狀態(tài))。不應(yīng)該用這個(gè)方法去存儲(chǔ)持久化數(shù)據(jù)。當(dāng)用戶離開這個(gè)activity的時(shí)候應(yīng)該在onPause()方法中存儲(chǔ)持久化數(shù)據(jù)(例如應(yīng)該被存儲(chǔ)到數(shù)據(jù)庫中的數(shù)據(jù))。
4.onSaveInstanceState()如果被調(diào)用,這個(gè)方法會(huì)在onStop()前被觸發(fā),但系統(tǒng)并不保證是否在onPause()之前或者之后觸發(fā)。
二、onRestoreInstanceState (Bundle outState)恢復(fù)
onRestoreInstanceState被調(diào)用的前提是,activity 確實(shí)被系統(tǒng)銷毀了,否則該方法不會(huì)被調(diào)用。
另外,onRestoreInstanceState的bundle參數(shù)也會(huì)傳遞到onCreate方法中,也可以選擇在onCreate方法中做數(shù)據(jù)還原。
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putBoolean("mBoolean", true);
savedInstanceState.putString("mString", "Hello World");
super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
boolean myBoolean = savedInstanceState.getBoolean("mBoolean");
String myString = savedInstanceState.getString("mString");
}