A → B → A 傳遞數據時,若用 startActivity 重新啟動 A,舊 A 實例 onDestroy 清除臨時數據;若用 startActivityForResult,B finish 後 A 接收數據,但用戶按 Back 會退出應用而非返回 B。
| 方案 | 適用場景 | 缺點 |
|---|---|---|
| ViewModel (Architecture Components) | Activity 間共享數據、配置變更保持 | 需引入 lifecycle 库 |
| Service (前台/後台) | 長期運行、跨進程數據 | 生命周期管理複雜、可能被系統殺死 |
| Application 子類單例 | 全局輕量級緩存 | 進程死掉數據丟失、內存洩漏風險 |
| 文件/SharedPreferences 持久化 | 需跨進程/重啟保持 | IO 開銷、序列化成本 |
// SharedViewModel.kt
class SharedViewModel : ViewModel() {
val tempData = MutableLiveData<String>()
}
// Activity A
val model = ViewModelProvider(this)[SharedViewModel::class.java]
model.tempData.observe(this) { data -> updateUI(data) }
// Activity B
val model = ViewModelProvider(requireActivity())[SharedViewModel::class.java] // 同一 Activity 對應同一 ViewModelStore
model.tempData.postValue("from B")注意:跨 Activity 共享 ViewModel 需使用同一 ViewModelStoreOwner(如 requireActivity() 在 Fragment 中,或自定義 ViewModelStore)。