目前為止,我們已經瞭解到了,當改變螢幕方向的時候,activity將會被銷毀,隨後被重建。請記住一點,當activity被重建之後,它的當前資訊可能消失。當一個activity被kill掉,將會調以下方法中的一個或著兩個:
onPause() —— 當一個activity被kill掉或被轉入背景時候,這個方法總是被調用。
onSaveInstanceState() —— 當一個activity將被kill掉或轉入背景時候,這個方法也會被掉用,就像onPause()方法一樣。但是,當一個activity從調用棧中清除的時候(例如按返回鍵的時候),這個方法不會被調用(註:onPause()方法會被調用),因為已經沒有必要儲存它的狀態了。
簡而言之,想要儲存activity的狀態,那麼總是要實現onPause()方法,然後使用你自己的方法去儲存狀態資訊,例如使用資料庫,外部或內部的儲存。
如果你想簡單地儲存狀態資訊,當activity在重新建立的時候,從新載入這些資訊。一個簡單的方法就是實現onSaveInstanceState()這個方法,因為它提供了一個Bundle對象作為參數,這樣,就可以使用這個Bundle對象去儲存activity的資訊。下面的代碼將展示如何使用onSaveInstanceState()方法:
[java]
@Override
public void onSaveInstanceState(Bundle outState) {
//---save whatever you need to persist---
outState.putString("ID", "1234567890");
super.onSaveInstanceState(outState);
}
當一個activity被重建,onCreate()方法會首先被調用,然後是onRestoreInstanceState()方法,就是這個方法能夠取回剛剛通過onSaveInstanceState()方法儲存的資訊:
[java]
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
//---retrieve the information persisted earlier---
String ID = savedInstanceState.getString("ID");
}
儘管可以使用onSavaInstanceState()方法去儲存狀態資訊,但這也有限制:只能通過Bundle對象去儲存你的資訊。如果你想儲存更多的、更複雜的資料結構,這種方法就顯得不太合適了。
可以使用的另外一種方法是使用onRetainNonConfigurationInstance()回調方法。當一個activity因為配置更改(例如螢幕方向的改變)而獎盃銷毀的時候,Android系統將調用這個方法。可以這麼使用:
[java]
@Override
public Object onRetainNonConfigurationInstance() {
//---save whatever you want here; it takes in an Object type---
return("Some text to preserve");
}
把你想儲存的東西,通過這個方法返回出來。
可以觀察到,這個方法返回一個Object對象,這就允許你返回任何資料類型。如果要提取儲存的資料,可以在onCreate()方法中進行提取,使用getLastNonConfigurationInstance()回調方法:
[java]
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d("StateInfo", "onCreate"); www.2cto.com
String str = (String) getLastNonConfigurationInstance();
}
onRetainNonConfigurationInstance()和getLastNonConfigurationInstance(),這兩個方法可以允許你隨時地儲存資訊。
例如,當使用者下載資料的同時改變了螢幕方法,使用這兩個方法去儲存資料,總好過重新下載資料吧。