Activity 回收

Activity 被回收後的資料處理

當一個 Activity 進入停止狀態時,有可能會被系統回收。

例如,當 Activity A 啟動了 Activity B,此時 Activity A 處於停止狀態。如果因為記憶體不足,系統將 Activity A 回收,而使用者之後按下返回鍵回到 Activity A,

畫面還是會正常顯示 Activity A,但此時並不會執行 onRestart(),而是執行 onCreate(),也就是 Activity A 會被重新建立。

如果 Activity A 裡有暫存資料,例如某個文字輸入框,使用者已經打了一串文字。一旦 Activity 被回收,剛才輸入的內容就會全部消失。

如果應用程式發生這種情況,會嚴重影響使用者體驗。

還好,Android 提供了一個 onSaveInstanceState() 回呼方法,這個方法保證會在 Activity 被回收之前被呼叫。

因此我們可以利用它來解決暫存資料在回收後遺失的問題。

onSaveInstanceState() 方法會帶有一個 Bundle 型別的參數。

Bundle 提供了一系列用來儲存資料的方法,例如 putString() 用來儲存字串,putInt() 用來儲存整數。

覆寫 onSaveInstanceState 方法

// 繁體中文(台灣)
@Override
protected void onSaveInstanceState(Bundle outState) { // 這個方法會在目前 Activity 被回收前呼叫
    super.onSaveInstanceState(outState);
    outState.putString("user_name", "潘小姐");
}Code language: JavaScript (javascript)
// 繁體中文(台灣)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.e(TAG, "onCreate: ");

    if (savedInstanceState != null) // 在 onCreate 裡,我們可以判斷 Bundle 是否有資料;如果有,代表 Activity 曾被回收,目前是重新建立
    {
        Log.e(TAG, savedInstanceState.getString("user_name"));
    }
}Code language: JavaScript (javascript)

重新建立時取得 Bundle 資料

在 onCreate 方法中,系統會傳入一個 Bundle 參數:

// 繁體中文(台灣)
protected void onCreate(Bundle savedInstanceState) {Code language: JavaScript (javascript)

取得 Bundle 資料

// 繁體中文(台灣)
if (savedInstanceState != null) // 在 onCreate 裡,我們可以判斷 Bundle 是否有資料;如果有,代表 Activity 曾被回收,目前是重新建立
{
    Log.e(TAG, savedInstanceState.getString("user_name"));
}Code language: JavaScript (javascript)

Activity 回收

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *