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

J2ME MIDlet 生命週期實戰驗證:簡單程式碼觀察 startApp/pauseApp/destroyApp 調用順序

     編輯:Java 程式設計入門

前言

MIDlet 生命週期是 J2ME 開發核心概念,但文檔描述較抽象。本文提供可直接執行的驗證程式,在模擟器中觀察各方法實際調用順序與時機。

驗證程式碼


// LifeCircleMIDlet.java
import javax.microedition.midlet.*;

public class LifeCircleMIDlet extends MIDlet {
    public LifeCircleMIDlet() {
        System.out.println("1. 建構子");
    }
    
    protected void startApp() {
        System.out.println("2. startApp()");
    }
    
    protected void pauseApp() {
        System.out.println("3. pauseApp()");
    }
    
    protected void destroyApp(boolean unconditional) {
        System.out.println("4. destroyApp(unconditional=" + unconditional + ")");
    }
}

WTK 模擟器操作與預期輸出

場景 1:正常啟動 → 關閉

  1. 啟動 MIDlet
  2. 選單 → 關閉 / 紅鍵掛斷
1. 建構子
2. startApp()
4. destroyApp(unconditional=true)

場景 2:啟動 → 暫停 → 恢復 → 關閉

  1. 啟動 MIDlet
  2. 選單 → 暫停 (Pause)
  3. 選單 → 恢復 (Resume)
  4. 關閉
1. 建構子
2. startApp()
3. pauseApp()
2. startApp()          <-- 恢復時再次調用!
4. destroyApp(true)

場景 3:來電/簡訊中斷 (系統強制暫停)

模擟器選單 → 接收來電 / 接收簡訊 → 掛斷 → 恢復

1. 建構子
2. startApp()
3. pauseApp()          <-- 系統強制暫停
2. startApp()          <-- 事件結束自動恢復
4. destroyApp(true)

生命週期狀態機

+----------+     startApp()      +---------+
|  Paused  | ------------------> | Active  |
+----------+                     +---------+
     ^   |                          |   ^
     |   | pauseApp()               |   | destroyApp(true)
     |   +--------------------------+   |
     |        (系統/用戶觸發)           |
     +----------------------------------+
              destroyApp(false)  (拒絕銷毀,回到 Paused)

關鍵規則總結

方法調用時機注意事項
建構子MIDlet 類別實例化時 (每次啟動一次)不可執行耗時操作,僅初始化欄位
startApp()進入 Active 狀態:啟動、恢復暫停、系統事件結束可能多次調用,必頂冪等;初始化 UI、啟動執行緒、恢復資源
pauseApp()進入 Paused 狀態:用戶暫停、來電、切換應用釋放獨佔資源 (網路連線、錄音、GPS)、停止動畫執行緒
destroyApp(b)銷毀 MIDlet:用戶關閉、系統回收記憶體b=true:必須銷毀;b=false:可拋出 MIDletStateChangeException 拒絕

最佳實踐模板


public class MyMIDlet extends MIDlet {
    private Display display;
    private MainScreen mainScreen;
    private NetworkManager netMgr;
    
    protected void startApp() {
        if (display == null) {
            display = Display.getDisplay(this);
            mainScreen = new MainScreen(this);
            netMgr = new NetworkManager();
        }
        display.setCurrent(mainScreen);
        netMgr.connect(); // 重新連線
    }
    
    protected void pauseApp() {
        netMgr.disconnect(); // 釋放網路
        // 停止動畫、計時器等
    }
    
    protected void destroyApp(boolean unconditional) {
        netMgr.shutdown();
        mainScreen = null;
        display = null;
    }
}

除錯技巧

  • WTK 輸出視窗查看 System.out.println
  • 真機測試:部署 .jar/.jad 到手機,透過藍牙/資料線查看日誌
  • 在 startApp 判斷 if (display == null) 避免重複建立 UI

總結

親自跑一次 LifeCircleMIDlet,在模擟器操作「暫停/恢復/關閉/來電」,觀察控制台輸出順序,即能將抽象生命週期內化為直觀認知。牢記 startApp 可重複調用、pauseApp 釋放資源、destroyApp 區分強制/非強制 三大鐵律,是穩健 MIDlet 開發的基石。

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