Activity A 包含 EditText、TextView,使用者輸入後跳轉至 Activity B,再從 B 返回 A 時需恢復原輸入內容。
// 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"));
}
}
// 存檔 (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
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 取
| 維度 | Intent | SharedPreferences | ViewModel |
|---|---|---|---|
| 生命週期 | 隨 Activity 銷毀消失 | 永久保存直到手動清除 | 隨 Activity 實例存活,配置變更保留 |
| 資料型別 | 基本型別、Parcelable、Serializable | 基本型別、String、Set<String> | 任意物件 |
| 跨進程 | 支援 | 支援 (MODE_MULTI_PROCESS 已棄用) | 不直接支援 |
| 推薦場景 | 簡單跳轉回傳 | 使用者偏好、Token、草稿箱 | 複雜表單、MVVM 架構專案 |
ViewModel 暫存(配置變更不丟失)。SharedPreferences 或 Room DB 持久化。Intent 明確契約。