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

J2ME HelloWorld 深度剖析:MIDlet 生命周期、Command 交互、JAD 屬性讀取與部署全流程

     編輯:J2ME

為什麼 J2ME HelloWorld 比 J2SE 復雜?

J2SE 只需 main() 入口,而 J2ME 應用由 AMS (應用管理系統) 托管生命周期,必須繼承 MIDlet、實現三大狀態轉換方法、處理命令事件、讀取部署描述符屬性。本文以生產級標準重寫 HelloWorld,覆蓋所有核心知識點。

MIDlet 三大狀態與轉換

狀態觸發條件開發者動作
Paused實例化後、pauseApp() 執行後釋放非關鍵資源,保存狀態
ActivestartApp() 執行初始化 UI、獲取顯示器、佔用資源
DestroyeddestroyApp(true) 或 notifyDestroyed()釋放所有資源、持久化數據、必須不可逆

destroyApp(boolean unconditional) 參數詳解

  • unconditional=false:AMS 請求銷毀,MIDlet 可拋出 MIDletStateChangeException 拒絕 (如有未保存數據)
  • unconditional=true:強制銷毀 (如系統內存不足),MIDlet 必須立即釋放資源返回,不得拋異常

標準 HelloWorld 完整代碼

package com.j2medev.mingjava;

import javax.microedition.midlet.*;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.microedition.lcdui.*;

public class HelloWorld extends MIDlet implements CommandListener {
    private Display display;
    private Form mainForm;
    private StringItem stringItem;
    private Command exitCommand = new Command("Exit", Command.EXIT, 1);

    // JAD 中自定義屬性鍵
    public static final String WEB_SITE = "WEB_SITE";

    protected void startApp() throws MIDletStateChangeException {
        initMIDlet();
        display.setCurrent(mainForm);
    }

    private void initMIDlet() {
        display = Display.getDisplay(this);
        mainForm = new Form("Hello World");
        stringItem = new StringItem(null, null);
        
        // 從 JAD 讀取屬性,實現配置外部化
        String text = getAppProperty(WEB_SITE);
        stringItem.setText(text != null ? text : "Default Text");
        
        mainForm.append(stringItem);
        mainForm.addCommand(exitCommand);
        mainForm.setCommandListener(this);
    }

    protected void pauseApp() {
        // 可選:釋放大對象、暫停動畫/音樂
    }

    protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {
        System.out.println("Application exiting...");
        // 釋放資源、關閉連接、保存 RMS 數據
    }

    public void commandAction(Command cmd, Displayable disp) {
        if (cmd == exitCommand) {
            try {
                destroyApp(false);
                notifyDestroyed();  // 通知 AMS 進入 Destroyed 狀態
            } catch (MIDletStateChangeException e) {
                e.printStackTrace();
            }
        }
    }
}

JAD 部署描述符 (HelloWorldMIDlet.jad)

MIDlet-Jar-Size: 2128
MIDlet-1: HelloWorld,/icon.png,com.j2medev.mingjava.HelloWorld
MIDlet-Jar-URL: HelloWorldMIDlet.jar
MicroEdition-Configuration: CLDC-1.0
MIDlet-Version: 1.0.0
MIDlet-Name: HelloWorldMIDlet
MIDlet-Vendor: www.J2MEdev.com
MicroEdition-Profile: MIDP-1.0
WEB_SITE: www.J2MEdev.com

關鍵屬性說明

  • MIDlet-1:格式 顯示名,圖標路徑(可選),主類全限定名
  • MIDlet-Jar-URL:OTA 部署時必須為絕對 URL
  • WEB_SITE:自定義屬性,代碼中通過 getAppProperty("WEB_SITE") 讀取

打包與部署流程

  1. 編譯:javac -bootclasspath %WTK_HOME%\lib\midpapi.zip -d . HelloWorld.java
  2. 預審核:preverify -classpath %WTK_HOME%\lib\midpapi.zip;. -d output com.j2medev.mingjava.HelloWorld
  3. 打包 JAR:jar cvf HelloWorldMIDlet.jar -C output . (含圖標 icon.png)
  4. 生成 JAD:創建上述文本文件,MIDlet-Jar-Size 填寫 JAR 實際字節數
  5. 運行:雙擊 JAD (WTK 模擬器) 或 OTA 上傳至手機

進階要點

  • 圖標要求:PNG 格式,建議 12×12 或 16×16 像素,放在 JAR 根目錄或包對應路徑
  • CLDC 版本選擇:1.0 兼容性最廣,1.1 支持 float/double,視目標設備而定
  • 混淆:發布前使用 ProGuard 等工具混淆,減小體積、保護邏輯
  • 簽名:需訪問受限 API (網絡、文件、PIM) 時必須簽名,獲得 Trusted 域權限

總結

這個「簡單」的 HelloWorld 其實包含了 J2ME 開發的完整骨架:MIDlet 生命周期管理、事件驅動 UI、屬性驅動配置、標準化打包部署。新手務必逐行理解,老手可作為項目模板復用。

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