MIDlet 生命週期是初學者最易混淆的概念。本文提供最小化測試程式碼,透過列印輸出直觀掌握四大方法被系統呼叫的時機與順序。
// 檔名:LifeCycleMIDlet.java
import javax.microedition.midlet.*;
public class LifeCycleMIDlet extends MIDlet {
public LifeCycleMIDlet() {
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 + ")");
}
}
1. 建構子
2. startApp()
4. destroyApp(unconditional=false)
1. 建構子
2. startApp()
3. pauseApp()
2. startApp() ← 恢復時再次呼叫
4. destroyApp(unconditional=false)
pauseApp()destroyApp(true),unconditional=true 表示必須釋放資源、不可拒絕| 方法 | 呼叫時機 | 開發者職責 |
|---|---|---|
建構子 | MIDlet 類別實例化時(僅一次) | 初始化欄位、非 UI 資源 |
startApp() | 啟動、恢復、切換回前景 | 顯示 UI (Display.setCurrent())、啟動執行緒、恢復資源 |
pauseApp() | 來電、訊息、使用者切換應用、鎖螢幕 | 釋放獨佔資源(網路連線、錄音、GPS)、暫停執行緒、存儲狀態 |
destroyApp() | 使用者結束、系統強制回收 | 釋放所有資源、關閉連線、儲存必要資料、notifyDestroyed() |
Display.getDisplay(this).setCurrent(...) → UI 可能未就緒startApp()pauseApp() 什麼都不做 → 佔用記憶體/網路導致系統殺掉進程display = nulldestroyApp(false) 拋出例外或拒絕結束unconditional=true 時必須無條件結束;false 時可詢問使用者(如未存檔),但最終仍須配合系統