public class SmsReceiver extends MIDlet implements MessageListener {
private MessageConnection conn;
private boolean done = false;
private int total = 0;
public void startApp() {
try {
// 監聽端口 6222
conn = (MessageConnection) Connector.open("sms://:6222");
conn.setMessageListener(this); // 註冊異步回調
new Thread(new Reader()).start(); // 啟動讀取線程
} catch (IOException e) { /* 錯誤處理 */ }
}
// 異步回調:有新短信到達
public void notifyIncomingMessage(MessageConnection c) {
if (c == conn) total++;
}
// 讀取線程:阻塞式接收
class Reader implements Runnable {
public void run() {
while (!done) {
try {
Message msg = conn.receive(); // 阻塞直到收到短信
// 解析 msg (TextMessage / BinaryMessage)
} catch (IOException e) { /* 錯誤處理 */ }
}
}
}
protected void pauseApp() {
done = true;
try { conn.close(); } catch (IOException e) {}
}
protected void destroyApp(boolean unconditional) {
done = true;
try {
conn.setMessageListener(null);
conn.close();
} catch (IOException e) {}
}
}
sms://:6222 表示監聽本地端口 6222,無需指定發送方號碼。notifyIncomingMessage 運行於系統線程,必須極快返回,僅做計數/標記。receive() 阻塞操作放入獨立線程,避免阻塞系統回調導致短信丟失或 ANR。pauseApp:釋放連接,標記停止讀取線程。destroyApp:移除監聽器,關閉連接,確保資源釋放。Message 實例可為 TextMessage(文本短信)或 BinaryMessage(數據短信),需 instanceof 判斷後轉型處理。MIDlet-Permissions: javax.microedition.io.Connector.sms。WMA 短信接收的核心模式是異步通知觸發 + 專用線程阻塞讀取,配合完善的生命周期管理,可構建穩定可靠的短信業務應用。