列表頁點擊項目跳轉詳情頁,詳情頁接收 Intent 數據(如 selected ID)。用戶返回列表頁後再次點擊其他項目跳轉同一詳情頁實例(singleTask 模式),需在詳情頁對比「上次 selected ID」與「本次 selected ID」決定是否刷新數據。
Activity 被系統銷毀後(內存不足、用戶滑動關閉),成員變量數據丟失。需將「上次 selected ID」持久化保存,下次啟動時讀取對比。
public class AppDescriptionActivity extends AppCompatActivity {
private static final String PREFS_NAME = "app_detail_prefs";
private static final String KEY_LAST_SELECTED_ID = "last_selected_id";
private String mLastSelectedId = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_app_description);
// 1. 讀取上次保存的 selected ID
loadLastSelectedId();
// 2. 獲取本次 Intent 傳遞的數據
Intent intent = getIntent();
if (intent != null) {
String currentSelectedId = intent.getStringExtra("SELECTEDID");
String name = intent.getStringExtra("NAME");
String amount = intent.getStringExtra("AMT");
String count = intent.getStringExtra("COUNT");
// 3. 對比判斷是否需刷新
if (!TextUtils.equals(mLastSelectedId, currentSelectedId)) {
// ID 變化:刷新 UI、請求新數據
refreshUI(name, amount, count, currentSelectedId);
// 4. 保存本次 ID 供下次對比
saveLastSelectedId(currentSelectedId);
} else {
// ID 相同:可選擇不刷新或部分更新
}
}
}
private void loadLastSelectedId() {
SharedPreferences sp = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
mLastSelectedId = sp.getString(KEY_LAST_SELECTED_ID, "");
}
private void saveLastSelectedId(String selectedId) {
SharedPreferences sp = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
sp.edit().putString(KEY_LAST_SELECTED_ID, selectedId).apply();
mLastSelectedId = selectedId; // 更新內存緩存
}
private void refreshUI(String name, String amount, String count, String selectedId) {
// 更新 TextView、ImageView、發起網絡請求等
}
}
| 方案 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| SharedPreferences | 少量鍵值對、跨進程/啟動持久化 | 簡單、系統管理、支持多進程 | 不適合大數據、複雜結構 |
| 成員變量 | Activity 存活期間臨時數據 | 極快、無 I/O | 銷毀即丟失 |
| ViewModel | 配置變更/導航保持數據 | 生命週期感知、自動保存恢復 | 進程死亡仍丟失 |
| 文件/數據庫 | 大量結構化數據 | 功能強大 | 複雜度高 |
public class AppDetailViewModel extends ViewModel {
private final SavedStateHandle handle;
private String lastSelectedId = "";
public AppDetailViewModel(SavedStateHandle handle) {
this.handle = handle;
lastSelectedId = handle.get("last_selected_id", "");
}
public void updateSelectedId(String newId) {
if (!TextUtils.equals(lastSelectedId, newId)) {
lastSelectedId = newId;
handle.set("last_selected_id", newId); // 自動持久化
// 觸發 UI 刷新
}
}
}
優勢:自動處理配置變更、進程恢復、跨 Fragment 共享,無需手動 SharedPreferences 代碼。
getSharedPreferences(name, MODE_PRIVATE) 而非 PreferenceManager.getDefaultSharedPreferences,隔離業務數據。static final String 常量,避免拼寫錯誤。apply() 異步提交,讀取用 getString(key, "") 提供默認值。mLastSelectedId 避免頻繁磁盤讀取。ViewModel + SavedStateHandle 替代手動 SP。