在 MIDP 應用程式中,多畫面切換是核心需求。隨著畫面數量增加,若缺乏結構化導航機制,程式碼將難以維護。本文探討三種導航模式,並深入實作適合「前進/後退」規律流程的堆疊式導航框架。
| 模式 | 優點 | 缺點 |
|---|---|---|
| MVC(如 SmartTicket) | 結構嚴謹,關注點分離 | Controller 膨脹、所有 View 啟動時初始化佔用記憶體、事件識別碼管理複雜 |
| 二叉樹導航 | 適合非線性流程 | 實作複雜,多數應用不需要 |
| 堆疊導航(本文推薦) | 結構簡單、符合直覺、按需建立畫面、自動保留回退狀態 | 跨畫面資料傳遞需透過建構子參數,參數可能隨層級增加 |
利用 MIDlet 單一實例特性作為控制器,結合 java.util.Stack 管理畫面歷史:
public class ControllerMIDlet extends MIDlet {
private static ControllerMIDlet instance = null;
private Display display = null;
private Stack uiStack = new Stack();
public ControllerMIDlet() { instance = this; }
protected void startApp() {}
protected void pauseApp() {}
protected void destroyApp(boolean unconditional) {}
/** 前進至下一個畫面 */
public static void forward(Displayable next) {
instance.uiStack.push(next);
instance.display.setCurrent(next);
}
/** 返回上一個畫面 */
public static void goBack() {
instance.uiStack.pop(); // 移除目前畫面
Object prev = instance.uiStack.peek(); // 取得前一畫面
instance.display.setCurrent((Displayable) prev);
}
/** 替換目前畫面(不保留回退至該畫面) */
public static void replace(Displayable next) {
instance.uiStack.pop();
instance.uiStack.push(next);
instance.display.setCurrent(next);
}
/** 連續壓入兩個畫面但只顯示第二個(如:登入頁隱藏壓入,顯示主選單) */
public static void forward(Displayable hidden, Displayable shown) {
instance.uiStack.push(hidden);
instance.uiStack.push(shown);
instance.display.setCurrent(shown);
}
}
直接呼叫 forward() 與 goBack(),堆疊行為符合 FILO 特性。

使用者從畫面 1 進入畫面 2(等待),再進畫面 3(結果)。若在畫面 3 按「返回」,應直接回畫面 1,而非畫面 2。解法:畫面 2→3 時呼叫 replace() 丟棄等待畫面。


使用 forward(hidden, shown) 實現「隱藏壓入」。返回時若取消操作,goBack() 會正確回到登入畫面。

