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

Android Activity 狀態保存:啟動模式與 onSaveInstanceState 確保返回時 UI 恢復

     編輯:程式設計綜合問答

從 Activity A 通過 startActivityForResult 跳轉到 Activity B,按 Back 返回 A 時,滾動位置、輸入框文本等 UI 狀態丟失。核心解決:**正確實現狀態保存/恢復機制**,而非依賴啟動模式。

根本原因

  • 系統在內存緊張時可能銷毀 Activity A,返回時重新創建,若未保存狀態則恢復默認值。
  • EditText、ScrollView 等視圖**必須設置 `android:id`** 才能自動參與系統默認的狀態保存 (基於 View ID 存儲)。

解決方案清單

  1. 確保所有需保存狀態的 View 設置唯一 `android:id`:
    <EditText android:id="@+id/et_input" ... />
    <ScrollView android:id="@+id/sv_container" ... > ... </ScrollView>
    
  2. 複雜數據手動保存 (onSaveInstanceState):
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState); // 必須調用父類,保存 View 狀態
        outState.putString("custom_key", customValue);
        outState.putInt("scroll_pos", scrollView.getScrollY());
    }
    
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        customValue = savedInstanceState.getString("custom_key");
        scrollView.post(() -> scrollView.scrollTo(0, savedInstanceState.getInt("scroll_pos")));
    }
    
  3. 勿濫用啟動模式:
    • `singleTop`/`singleTask` 可避免重建實例,但**不解決系統回收內存導致的重建**,且引入任務棧管理複雜性。
    • 標準模式 + 完整狀態保存 = 最穩健、符合 Android 設計哲學。
  4. ViewModel + SavedStateHandle (現代架構):
    class MyViewModel(SavedStateHandle handle) : ViewModel() {
        var text by handle.getLiveData("input_text", "")
        var scrollY by handle.getLiveData("scroll_y", 0)
    }
    
    自動處理配置變更、進程死亡重建,推薦新項目採用。

驗證清單

  • 旋轉屏幕 (配置變更) → UI 狀態保持?
  • Home 鍵回桌面 → 打開多個大內存 App → 返回原 App → UI 狀態保持? (模擬進程被殺)
  • 開發者選項 → **「不保留活動」** 開啟 → 重現上述場景,必須通過。

Android 生命周期核心:**假設 Activity 隨時會被銷毀重建**,在 onSaveInstanceState / ViewModel 中持久化所有不可重算的 UI 狀態,是專業開發者的基本功。

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