Android **預設行為**即符合需求:**同一 Task 內,Activity 堆疊保留**,按 Home 回 Launcher 再點擊圖示,**不會重新建立 Activity**,而是呼叫 onRestart() → onStart() → onResume() 恢復上次畫面 (包括 Fragment、View 狀態)。
Intent.ACTION_MAIN + CATEGORY_LAUNCHER,或使用 PackageManager.getLaunchIntentForPackage() 取得系統預設啟動 Intent。**不可** 手動指定 ComponentName 指向非主 Activity (除非刻意深層連結)。FLAG_ACTIVITY_NEW_TASK (除非在單獨 Task)、FLAG_ACTIVITY_CLEAR_TOP、FLAG_ACTIVITY_CLEAR_TASK、FLAG_ACTIVITY_NO_HISTORY 等。standard),否則會破壞返回堆疊行為。// 正確啟動方式
Intent intent = packageManager.getLaunchIntentForPackage("com.example.filemanager");
if (intent != null) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // Launcher 在不同 Task 需此旗標
startActivity(intent);
}
若需跨進程死亡恢復 (系統回收記憶體),在 Activity 實作:
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
// 儲存當前 Fragment、捲動位置、輸入內容等
outState.putInt("current_fragment", currentFragmentIndex);
outState.putString("search_query", searchEditText.getText().toString());
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
currentFragmentIndex = savedInstanceState.getInt("current_fragment");
// 切換 Fragment、恢復輸入...
}
SavedStateHandle 跨配置變更與進程死亡保存 UI 狀態。| 誤區 | 正確理解 |
|---|---|
| 以為需手動記錄「上次 Activity」並啟動 | 系統自動管理 Task 堆疊,Launcher 只需發送標準啟動 Intent |
使用 startActivity(MainActivity.class) 導致重建 | 若 Intent 含 FLAG_ACTIVITY_CLEAR_TOP 或 manifest 設 android:clearTaskOnLaunch="true" 會重建 |
**結論**:遵循標準啟動流程,**無需額外代碼** 即可實現「回到上次狀態」;若需極端情況 (進程被殺) 保存,配合 onSaveInstanceState / ViewModel 即可。