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

Android Activity 生命週期:為什麼 onCreate 必須呼叫 super.onCreate()?

     編輯:程式設計綜合問答

在 Android 開發中,重寫 onCreate() 時,第一行通常是 super.onCreate(savedInstanceState)。許多初學者疑惑:為什麼一定要呼叫父類方法?這背後涉及 Activity 的「現場保護」與狀態恢復機制。

核心原因:父類完成關鍵初始化

Activity 基類(實際上是 ComponentActivity)在 onCreate() 中執行了以下關鍵工作:

  • 建立 PhoneWindow、DecorView 等視窗結構
  • 解析佈局 XML(setContentView() 依賴此)
  • 初始化 FragmentManager、ViewModelStore 等核心組件
  • 從 savedInstanceState 恢復 Fragment 狀態、View 標籤等

若不呼叫 super.onCreate(),上述初始化將被跳過,導致 setContentView() 崩潰、Fragment 丟失、ViewModel 無法恢復等嚴重問題。

什麼是「現場保護」?

當 Activity 因記憶體不足、配置變更(如旋轉螢幕)被系統銷毀時,系統會呼叫 onSaveInstanceState(Bundle outState) 讓你保存臨時資料。重建時,這個 Bundle 會傳遞給 onCreate(Bundle savedInstanceState) 與 onRestoreInstanceState()。

流程圖解

使用者離開/旋轉螢幕
        ↓
onSaveInstanceState(Bundle)  ← 開發者存入:輸入框文字、捲動位置、選中項目
        ↓
系統銷毀 Activity
        ↓
系統重建 Activity
        ↓
onCreate(savedInstanceState)  ← 父類自動恢復 View 階層、Fragment 狀態
        ↓
onRestoreInstanceState(Bundle)  ← 開發者讀取:恢復自定義變數

正確覆寫範例

@Override
protected void onCreate(Bundle savedInstanceState) {
    // 1. 必須最先呼叫父類,完成基礎設施初始化與狀態恢復
    super.onCreate(savedInstanceState);

    // 2. 設定佈局(此時 Window、View 已就緒)
    setContentView(R.layout.activity_main);

    // 3. 初始化 View、綁定資料
    EditText et = findViewById(R.id.edit_text);
    if (savedInstanceState != null) {
        // 4. 讀取父類未自動恢復的自定義資料
        String draft = savedInstanceState.getString("draft_text");
        et.setText(draft);
    }
}

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState); // 讓父類保存 View 狀態
    outState.putString("draft_text", editText.getText().toString());
}

常見誤區

誤區後果
把 super.onCreate() 放在 setContentView() 之後視窗未建立完成,setContentView 崩潰
完全不呼叫 super.onCreate()FragmentManager、ViewModel、SavedStateRegistry 全失效
以為 savedInstanceState 只在旋轉時非 null進程被回收重建時也會非 null,需統一處理

總結

super.onCreate() 不是形式,而是 Android 框架完成「現場保護」與基礎設施初始化的關鍵契機。永遠將其放在覆寫方法的第一行,確保 Activity 生命週期正常運作。

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