J2SE 只需 main() 入口,而 J2ME 應用由 AMS (應用管理系統) 托管生命周期,必須繼承 MIDlet、實現三大狀態轉換方法、處理命令事件、讀取部署描述符屬性。本文以生產級標準重寫 HelloWorld,覆蓋所有核心知識點。
| 狀態 | 觸發條件 | 開發者動作 |
|---|---|---|
| Paused | 實例化後、pauseApp() 執行後 | 釋放非關鍵資源,保存狀態 |
| Active | startApp() 執行 | 初始化 UI、獲取顯示器、佔用資源 |
| Destroyed | destroyApp(true) 或 notifyDestroyed() | 釋放所有資源、持久化數據、必須不可逆 |
unconditional=false:AMS 請求銷毀,MIDlet 可拋出 MIDletStateChangeException 拒絕 (如有未保存數據)unconditional=true:強制銷毀 (如系統內存不足),MIDlet 必須立即釋放資源返回,不得拋異常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();
}
}
}
}
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 部署時必須為絕對 URLWEB_SITE:自定義屬性,代碼中通過 getAppProperty("WEB_SITE") 讀取javac -bootclasspath %WTK_HOME%\lib\midpapi.zip -d . HelloWorld.javapreverify -classpath %WTK_HOME%\lib\midpapi.zip;. -d output com.j2medev.mingjava.HelloWorldjar cvf HelloWorldMIDlet.jar -C output . (含圖標 icon.png)MIDlet-Jar-Size 填寫 JAR 實際字節數這個「簡單」的 HelloWorld 其實包含了 J2ME 開發的完整骨架:MIDlet 生命周期管理、事件驅動 UI、屬性驅動配置、標準化打包部署。新手務必逐行理解,老手可作為項目模板復用。