在 Android 開發中,重寫 onCreate() 時,第一行通常是 super.onCreate(savedInstanceState)。許多初學者疑惑:為什麼一定要呼叫父類方法?這背後涉及 Activity 的「現場保護」與狀態恢復機制。
Activity 基類(實際上是 ComponentActivity)在 onCreate() 中執行了以下關鍵工作:
PhoneWindow、DecorView 等視窗結構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 生命週期正常運作。