一、J2ME 所需 Java 基礎知識(精簡版)
| ✅ 必須掌握 | ❌ 暫不需要 / 差異巨大 |
- 語法基礎:基本類型、關鍵字、運算符、流程控制
- 面向對象:類/對象、封裝/繼承/多態、接口/抽象類
- 異常處理:try-catch-finally、throws、常見異常類
- 多線程:Thread/Runnable、synchronized、wait/notify
|
- JDK 命令行工具 (javac/java 參數) — IDE 自動化
- J2SE 庞大類庫 — J2ME 類庫大幅裁剪,需熟悉
javax.microedition.*
- Applet / AWT / Swing — 完全不適用,UI 使用 LCDUI (高級/低級)
|
建議:直接閱讀 J2ME 官方 API 文檔,邊寫邊查,比泛讀 J2SE 書籍高效得多。
二、J2ME 當前暫時無法實現的功能
- 游戲免修改跨機型移植(屏幕尺寸、API 差異導致)
- Canvas 上動態修改按鈕文字 / 接收中文輸入
- 訪問本地資源:通訊錄、短信庫、文件系統 (JSR 75 未普及時)
- 製作破壞性病毒 (沙箱模型限制)
三、J2ME 跨平台現狀與應對策略
四大核心差異來源
- 屏幕尺寸碎片化:高級 UI (Form/List) 自適應較好;低級 UI (Canvas/GameCanvas) 需手動適配座標、圖片縮放。
- 廠商擴展 API 不統一:Nokia UI、Siemens UI、Moto UI 互不兼容,包名、類名均不同。
- 廠商實現 Bug:如 Nokia 7650 雙緩衝 Bug、Nokia 系列音頻混音 Bug 等,需針對機型規避。
- 硬件性能差異:Heap 大小 (S40 多為 210KB)、JAR 大小限制 (S40 多 64KB)、CPU/GPU 性能。
行業現狀
游戲/應用發布時均附帶支持機型列表,「移植工程師」成為專門崗位,負責座標調整、API 替換、資源壓縮。
四、J2ME 相關職業方向
| 崗位 | 核心技能 | 典型工作內容 |
| J2ME 游戲開發 |
高/低級 UI、線程、網絡編程、游戲邏輯、圖形渲染優化 |
按策劃文檔在特定平台 (S40/S60) 開發游戲 |
| J2ME 應用開發 |
高級 UI、線程、網絡、RMS、JSR 75/82/179 等可選包 |
移動商務、定位服務、即時通訊、工具類應用 |
| J2ME 游戲移植 |
熟悉各平台差異、屏幕參數、Heap/JAR 限制、API 映射表 |
將 S40 游戲移植到 S60、Sony Ericsson、Motorola 等 |
五、J2ME 程序設計六大原則
- 堅持面向對象:雖面向過程可減小體積,但 OO 利於維護擴展。
- 採用 MVC 模式:模型/視圖/控制分離,大型項目必備。
- 自動保存用戶設置:RMS 存儲用戶名、密碼、偏好,支持自動登錄。
- 系統設置用戶可關閉:背景音樂、背光、震動等提供開關。
- 繪圖邏輯放入獨立線程:避免阻塞事件分發線程,保證 UI 響應。
- 耗時操作顯示等待界面:網絡請求、大數據處理時顯示進度條/Loading。
六、從模擬器到真機測試
為什麼必須真機測試?
- 模擬器存在實現 Bug,行為與真機不一致。
- 真機內存、CPU、網絡延遲、按鍵手感均無法完全模擬。
傳輸方式
- OTA 下載 (WAP/HTTP)
- 數據線 (PC Suite)
- 紅外 / 藍牙
真機測試重點
- 功能完整性
- 操作易用性
- 文件大小 (S40 64KB 限制)
- 運行速度/幀率可接受性
七、從 WTK 到廠商 SDK 的必經之路
| 廠商 | SDK 下載地址 | 特點 |
| Nokia | https://forum.nokia.com.cn/ | 文檔最全、模擬器最準、UI 擴展最豐富 |
| Siemens | https://communication-market.siemens.de/... | SDK+獨立模擬器 |
| Sony Ericsson | https://developer.sonyericsson.com/ | 自帶模擬器 |
| Motorola | https://www.motocoder.com/ | SDK 內含模擬器 |
| Samsung | https://developer.samsungmobile.com/ | SDK+模擬器 |
| NEC | https://www.nec-mfriend.com/cn | 集成模擬器 SDK |
差異:廠商 SDK = WTK 基礎 + 專屬模擬器 + 擴展 API。使用時引入廠商 JAR 即可調用擴展類庫。
常見問題:廠商 SDK 也有 Bug,且與真機仍有出入 (如 Nokia 混音問題),最終仍以真機為準。
八、獲取手機 IMEI 的廠商專屬方法
// Motorola
String imei = System.getProperty("IMEI");
// Siemens
String imei = System.getProperty("com.siemens.IMEI");
無統一標準屬性,需查閱目標廠商開發文檔。
九、網絡編程界面顯示異步問題解決
現象:發起網絡請求後,未收到數據界面先顯示 (背景圖出現、內容為空)。
三步解決法:
- 構造目標界面時啟動網絡請求,但不調用
Display.setCurrent()。
- 顯示等待界面 (進度條/Loading),提示用戶「連接中...」。
- 網絡回調數據處理完成後,調用
Display.setCurrent(targetScreen) 切換到目標界面。
核心思想:界面切換與數據就緒同步,避免「殼」先於「芯」顯示。