啟動時顯示品牌 Logo、版本資訊,經過固定時間(如 3 秒)或使用者按任意鍵後自動切換至主畫面。核心在於「定時自動跳轉」與「使用者可提前跳過」兩條路徑的同步處理。
java.util.Timer:排程器,內部維護一條執行緒,負責在指定時間或週期性執行任務。java.util.TimerTask:實作 Runnable 的任務載體,覆寫 run() 放入具體邏輯。Canvas):負責繪製歡迎圖片、初始化 Timer、處理按鍵事件。TimerTask):定時觸發,呼叫 SplashScreen.dismiss() 切換畫面。package splash.welcome.view;
import java.io.IOException;
import java.util.Timer;
import javax.microedition.lcdui.*;
public class SplashScreen extends Canvas {
private Display display;
private TextBox next; // 主畫面佔位
private Timer timer;
private final int MAX_TIME = 3000; // 3 秒
private Image image;
private final String file = "/res/splash.png";
public SplashScreen(Display display) {
this.display = display;
timer = new Timer();
loadImage();
display.setCurrent(this);
// 排程:MAX_TIME 後執行 ShowMainScreen
timer.schedule(new ShowMainScreen(this), MAX_TIME);
}
private void loadImage() {
try { image = Image.createImage(file); }
catch (IOException e) { e.printStackTrace(); }
}
protected void paint(Graphics g) {
g.drawImage(image, 0, 0, Graphics.LEFT | Graphics.TOP);
}
protected void keyPressed(int key) {
dismiss(); // 任意鍵立即跳過
}
public void dismiss() {
timer.cancel(); // 取消定時器,防止重複執行
next = new TextBox("Welcome", "Welcome to come here!", 40, TextField.ANY);
display.setCurrent(next);
}
}
package splash.welcome.view;
import java.util.TimerTask;
public class ShowMainScreen extends TimerTask {
private SplashScreen splash;
public ShowMainScreen(SplashScreen splash) { this.splash = splash; }
public void run() { splash.dismiss(); }
}
package splash.welcome.midlet;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import splash.welcome.view.SplashScreen;
public class SplashMidlet extends MIDlet {
private Display display;
private Canvas splash;
public SplashMidlet() { display = Display.getDisplay(this); }
protected void startApp() { splash = new SplashScreen(display); }
protected void pauseApp() {}
protected void destroyApp(boolean unconditional) {}
}
dismiss(),timer.cancel() 具冪等性,重複呼叫安全。Timer.cancel() 會終止排程執行緒(若無其他任務),避免記憶體洩漏。SplashScreen(View/Controller)與 ShowMainScreen(Timer 觸發器)職責清晰,易於擴充。paint() 中根據經過時間調整 Alpha 值。pointerPressed() 呼叫 dismiss()。