開發者發現專案中 Activity 僅覆寫 onCreate 與 onResume 兩個生命週期方法,詢問這是否正常。本文解析兩方法核心差異、典型使用場景與完整生命週期脈絡。
核心差異一覽表
| 特性 | onCreate(Bundle) | onResume() |
| 呼叫時機 | Activity 首次建立時 (冷啟動) | Activity 進入前台、可見且可互動時 |
| 呼叫頻率 | 生命週期中僅一次 | 每次從後台/遮蔽狀態回到前台都會呼叫 |
| 典型工作 | UI 初始化、資料綁定、一次性設定 | 恢復動畫、註冊監聽器、重新獲取焦點資料 |
| Bundle 參數 | 包含儲存的實例狀態 (旋轉螢幕等重建時) | 無參數 |
| 對應配對方法 | onDestroy() | onPause() |
你的代碼分析
// onCreate: 僅執行一次,適合初始化
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_news_detail);
getWindow().setBackgroundDrawable(null);
initView(); // findViewById 等 UI 綁定
}
// onResume: 每次進入前台都執行,適合刷新資料
@Override
protected void onResume() {
super.onResume();
Intent intent = getIntent();
item = (BlogItem) intent.getSerializableExtra("item");
if (item != null) {
title.setText(item.getTitle());
url = PATH + item.getId();
loadBolgDetailInfo(url); // 網路請求/資料刷新
}
}
這個設計模式的優點
- 關注點分離:UI 建構 (onCreate) 與資料刷新 (onResume) 解耦
- 支援返回刷新:用戶按 Home 鍵離開、再從桌面圖標回來時,
onResume 會重新載入最新資料
- 符合生命週期契約:
onCreate 做昂貴的一次性初始化,onResume 做輕量級恢復
潛在問題與改進
| 問題 | 風險 | 改進 |
| 網路請求在 onResume | 頻繁切換觸發重複請求、ANR 風險 | 加入載入狀態旗標、使用 ViewModel+LiveData 緩存、或改用 onNewIntent 處理新 Intent |
| getIntent() 可能取到舊 Intent | 啟動模式 singleTop 時需用 onNewIntent | 在 onNewIntent 更新 intent 參考:setIntent(intent) |
| 未處理儲存狀態恢復 | 旋轉螢幕導致資料重載 | onSaveInstanceState 保存 item ID,onCreate 恢復 |
完整生命週期脈絡圖
[啟動] → onCreate → onStart → onResume → [前台運行]
↑
[返回桌面/來電/彈窗] → onPause → onStop → [後台/可見但不可互動]
↑
[完全遮蔽/銷毀] → onDestroy → [進程結束]
↑
[配置變更/記憶體不足] → onSaveInstanceState → onDestroy → onCreate (重建)
最佳實踐速查表
| 生命週期 | 建議操作 | 避免操作 |
| onCreate | setContentView、findViewById、ViewModel 初始化、一次性資料載入 | 耗時網路請求、動畫啟動、註冊廣播接收器 |
| onStart | UI 可見前準備、開始動畫 | 重度運算 |
| onResume | 註冊監聽器、恢復攝影機/傳感器、刷新即時資料、開始前台服務 | 耗時初始化 (應在 onCreate)、阻塞主執行緒 |
| onPause | 取消註冊監聽器、暫停動畫、儲存草稿、提交變更 | 耗時操作 (系統允許時間極短)、網路請求 |
| onStop | 釋放大型資源 (Bitmap、資料庫連線)、停止位置更新 | UI 操作 (已不可見) |
| onDestroy | 最終清理、取消註冊系統級接收器 | 依賴此方法釋放關鍵資源 (系統可能直接殺進程) |
總結
僅覆寫 onCreate 和 onResume 是常見且合理的精簡模式,適合「UI 初始化一次、資料每次進前台刷新」的場景。但需注意:網路請求避免在 onResume 重複觸發、妥善處理 onNewIntent、配合 ViewModel 管理資料生命週期,才能構建健壯的 Android 應用。
- 上一篇文章: JSP Servlet MySQL 實作:Checkbox 批次審核功能完整解決方案
- 下一篇文章: Swift UITextField 處理:Optional 綁定與空值判斷最佳實踐
Copyright ©
程式碼之家 All Rights Reserved