Android 程式開發:(七)處理變化 —— 7.2 保存狀態等信息

目前為止,我們已經瞭解到瞭,當改變屏幕方向的時候,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.aiwalls.com
        String str = (String) getLastNonConfigurationInstance(); 
 
    } 
onRetainNonConfigurationInstance()和getLastNonConfigurationInstance(),這兩個方法可以允許你隨時地保存信息。
例如,當用戶下載數據的同時改變瞭屏幕方法,使用這兩個方法去保存數據,總好過重新下載數據吧。

發佈留言