import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MyMIDlet extends MIDlet implements CommandListener {
// 成員欄位
private Display display;
private Form mainForm;
private Command cmdExit;
public MyMIDlet() {
// 僅執行一次的初始化:載入資源、建立 UI 元件
display = Display.getDisplay(this);
mainForm = new Form("主選單");
cmdExit = new Command("離開", Command.EXIT, 1);
mainForm.addCommand(cmdExit);
mainForm.setCommandListener(this);
}
protected void startApp() {
// MIDlet 進入 Active 狀態:顯示主畫面、恢復執行緒
display.setCurrent(mainForm);
}
protected void pauseApp() {
// 進入 Paused:釋放獨佔資源(音訊、網路連線)、暫停遊戲迴圈
}
protected void destroyApp(boolean unconditional) {
// 銷毀:儲存設定、關閉 RMS、釋放所有資源
// unconditional=true 表示必須銷毀,不可拋出 MIDletStateChangeException
}
public void commandAction(Command c, Displayable d) {
if (c == cmdExit) {
destroyApp(false);
notifyDestroyed();
}
}
}
| 方法 | 觸發時機 | 典型處理 |
|---|---|---|
startApp() | 啟動、從 Paused 恢復、來電結束 | 顯示 UI、啟動執行緒、恢復音訊 |
pauseApp() | 來電介入、切換應用、鎖定螢幕 | 釋放資源、暫停遊戲、停止網路輪詢 |
destroyApp() | 使用者結束、系統回收記憶體 | 存檔、關閉連線、清理靜態參考 |
try-catch 包裹所有受檢例外。實作 CommandListener 介面,將同一 MIDlet 作為所有 Displayable 的聽眾,透過 Command 物件辨識動作來源。大型專案可採用命令模式或狀態機分離事件處理邏輯。
| J2SE | MIDP | 差異 |
|---|---|---|
Application.main() | MIDlet.startApp() | AMS 控制生命週期,非 main 進入點 |
Applet.init/start/stop/destroy | MIDlet 四狀態 | Applet 由瀏覽器管理,MIDlet 由 AMS 管理 |
Servlet.init/service/destroy | 同樣有初始化/服務/銷毀 | Servlet 多執行緒,MIDlet 單執行緒模型 |
| 視窗/Frame | Display/Displayable | 無視窗疊加,單一全螢幕 |
startApp 內判斷是否已初始化,避免重複建立資源。pauseApp 必須釋放獨佔資源(Player、HttpConnection、RecordStore)。destroyApp(true) 絕不拋例外,確保乾淨退出。notifyDestroyed() 主動通知 AMS 結束。掌握 MIDlet 生命週期與事件模型,能編寫穩健、符合平台規範的行動應用,避免常見的資源洩漏與狀態混亂問題。