首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android Activity 資料保存與恢復:Intent 傳值、SharedPreferences、ViewModel 全方案

     編輯:程式設計綜合問答

場景描述

Activity A 包含 EditText、TextView,使用者輸入後跳轉至 Activity B,再從 B 返回 A 時需恢復原輸入內容。

方案一:Intent 暫存(適用單向跳轉、資料量小)

// A → B
Intent intent = new Intent(A.this, B.class);
intent.putExtra("et_text", editText.getText().toString());
intent.putExtra("tv_text", textView.getText().toString());
startActivity(intent);

// B → A (假設 B 以 finish() 返回)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        editText.setText(data.getStringExtra("et_text"));
        textView.setText(data.getStringExtra("tv_text"));
    }
}

方案二:SharedPreferences 持久化(適用跨進程、長期保存)

// 存檔 (A onPause/onStop)
SharedPreferences sp = getSharedPreferences("form_data", MODE_PRIVATE);
sp.edit()
  .putString("et_text", editText.getText().toString())
  .putString("tv_text", textView.getText().toString())
  .apply();

// 讀取 (A onCreate/onResume)
SharedPreferences sp = getSharedPreferences("form_data", MODE_PRIVATE);
editText.setText(sp.getString("et_text", ""));
textView.setText(sp.getString("tv_text", ""));

方案三:ViewModel + SavedStateHandle (現代架構、配置變更自動保存)

// ViewModel
public class FormViewModel extends ViewModel {
    private final SavedStateHandle handle;
    public FormViewModel(SavedStateHandle handle) { this.handle = handle; }
    public String getEtText() { return handle.get("et_text"); }
    public void setEtText(String v) { handle.set("et_text", v); }
    // tv_text 同理
}

// Activity A
FormViewModel vm = new ViewModelProvider(this).get(FormViewModel.class);
// 即時雙向綁定或 onPause 存、onResume 取

方案對比與選型建議

維度IntentSharedPreferencesViewModel
生命週期隨 Activity 銷毀消失永久保存直到手動清除隨 Activity 實例存活,配置變更保留
資料型別基本型別、Parcelable、Serializable基本型別、String、Set<String>任意物件
跨進程支援支援 (MODE_MULTI_PROCESS 已棄用)不直接支援
推薦場景簡單跳轉回傳使用者偏好、Token、草稿箱複雜表單、MVVM 架構專案

最佳實踐:組合使用

  • 表單即時輸入 → ViewModel 暫存(配置變更不丟失)。
  • 使用者主動「儲存草稿」 → SharedPreferences 或 Room DB 持久化。
  • 跨 Activity 明確傳遞 → Intent 明確契約。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved