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 回收