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

Android Launcher 啟動 App 恢復上次狀態:Activity 啟動模式與儲存狀態

     編輯:程式設計綜合問答

核心機制

Android **預設行為**即符合需求:**同一 Task 內,Activity 堆疊保留**,按 Home 回 Launcher 再點擊圖示,**不會重新建立 Activity**,而是呼叫 onRestart() → onStart() → onResume() 恢復上次畫面 (包括 Fragment、View 狀態)。

必要條件

  1. 啟動 Intent 正確:Launcher 應發送 Intent.ACTION_MAIN + CATEGORY_LAUNCHER,或使用 PackageManager.getLaunchIntentForPackage() 取得系統預設啟動 Intent。**不可** 手動指定 ComponentName 指向非主 Activity (除非刻意深層連結)。
  2. 未設定破壞堆疊的 Flag**:Intent **不含** FLAG_ACTIVITY_NEW_TASK (除非在單獨 Task)、FLAG_ACTIVITY_CLEAR_TOP、FLAG_ACTIVITY_CLEAR_TASK、FLAG_ACTIVITY_NO_HISTORY 等。
  3. 主 Activity launchMode 非 singleInstance/singleTask** (預為 standard),否則會破壞返回堆疊行為。

程式碼範例 (Launcher 端)

// 正確啟動方式
Intent intent = packageManager.getLaunchIntentForPackage("com.example.filemanager");
if (intent != null) {
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // Launcher 在不同 Task 需此旗標
    startActivity(intent);
}

App 端:儲存/恢復複雜狀態

若需跨進程死亡恢復 (系統回收記憶體),在 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、恢復輸入...
}

進階:Jetpack Navigation / ViewModel

  • Navigation Component:自動儲存/恢復回退堆疊與 Fragment 狀態。
  • ViewModel:配合 SavedStateHandle 跨配置變更與進程死亡保存 UI 狀態。

常見誤區

誤區正確理解
以為需手動記錄「上次 Activity」並啟動系統自動管理 Task 堆疊,Launcher 只需發送標準啟動 Intent
使用 startActivity(MainActivity.class) 導致重建若 Intent 含 FLAG_ACTIVITY_CLEAR_TOP 或 manifest 設 android:clearTaskOnLaunch="true" 會重建

**結論**:遵循標準啟動流程,**無需額外代碼** 即可實現「回到上次狀態」;若需極端情況 (進程被殺) 保存,配合 onSaveInstanceState / ViewModel 即可。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved