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

J2ME MIDlet 生命週期深度解析:狀態機模型與常見誤區

     編輯:J2ME

核心結論:生命週期完全由 AMS 掌控

MIDlet 的三大狀態 —— Paused(停止)、Active(激活)、Destroyed(銷毀) —— 只能由應用程序管理器(AMS) 觸發轉換。MIDlet 自身調用 startApp/pauseApp/destroyApp 不會改變狀態,僅作為回調入口。

狀態機圖解


[啟動] --> (AMS) --> [Paused] --(AMS 調用 startApp)--> [Active]
                                    ^                      |
                                    |                      v
                              (AMS 調用 pauseApp)    (AMS 調用 destroyApp)
                                    |                      |
                                    +---------- [Destroyed] <--- (AMS 強制銷毀)

關鍵方法語義

方法調用者語義常見誤區
startApp()AMS進入 Active 狀態,**每次從 Paused 恢復都會調用**❌ 放一次性初始化代碼 → 重複執行
pauseApp()AMS即將進入 Paused,**釋放佔用資源(網絡、線程、音頻)**❌ 忽略釋放 → 來電時資源洩漏
destroyApp(boolean unconditional)AMS即將銷毀,**最後釋放、持久化存檔**;unconditional=true 表示強制銷毀,必須返回❌ 拋異常阻止銷毀 → AMS 強制殺進程

主動請求狀態變更(軟性控制)


// 請求激活(如後台下載完成喚醒前台)
resumeRequest();

// 通知 AMS 我願意進入 Paused(如用戶按掛機鍵)
notifyPaused();  // 不會觸發 pauseApp()!

// 通知 AMS 我已準備好銷毀
notifyDestroyed();  // 不會觸發 destroyApp()!

最佳實踐:主動請求前先手動調用對應回調,確保邏輯一致:


// 正確的主動退出流程
public void exitGame() {
    destroyApp(true);   // 先執行清理邏輯
    notifyDestroyed();  // 再請求 AMS 銷毀
}

構造函數 vs startApp()

  • 構造函數:MIDlet 實例化時調用 **一次**,適合一次性初始化(載入配置、建立連接池、啟動後台線程)
  • startApp():每次 **Paused → Active** 觸發,適合恢復 UI、重新獲取焦點資源

典型生命週期場景

場景AMS 行為MIDlet 應對
用戶啟動應用構造器 → Paused → startApp()構造器做重初始化,startApp 顯示主畫面
來電中斷pauseApp() → Paused釋放音頻、網絡、暫停遊戲邏輯線程
通話結束返回startApp() → Active恢復音頻、重連網絡、恢復遊戲循環
用戶按紅鍵掛機pauseApp() → Paused → destroyApp(false) → DestroyeddestroyApp 存檔、關閉連接、釋放所有資源
系統低內存強殺destroyApp(true) → Destroyed(不保證調用 pauseApp)destroyApp 必須快速返回,無阻塞操作

常見坑與對策

  1. 在 startApp 重複 new 物件 → 改用構造函數或懶加載單例
  2. pauseApp 未釋放 Player/Connection → 來電後無聲、網絡洩漏
  3. destroyApp 拋 RuntimeException → AMS 強制殺進程,數據可能丟失
  4. notifyPaused 後繼續佔用 CPU → 系統判定為惡意應用,降低優先級
  5. 多次調用 resumeRequest → AMS 可能忽略,需加防重標誌

總結口訣

構造器一次,startApp 多次;
pauseApp 放資源,destroyApp 存檔;
主動請求先回調,AMS 掌生殺大權。

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