隨著移動通信的突飛猛進,移動開發這個新鮮的字眼慢慢成為開發者關注的熱點。在網上進行的最近一份調查顯示,有24.34%的受訪者涉足嵌入式/移動設備應用開發,這個數字可能略高於實際的比例,但也足可說明嵌入式/移動設備應用開發是一塊誘人的新鮮奶酪。
<!-- frame contents -->
<!-- /frame contents -->
J2ME(Java 2 Micro Edition)是嵌入式/移動應用平台的王者,Linux和WinCE分列二、三位。Nokia等廠商力推的Symbian平台目前開發者占有率尚未達到滿足水平,考慮到調查項合並了嵌入式設備(例如PDA)和移動設備(例如智能手機),Symbian、WinCE系列在移動平台上會是競爭的主要兩方。假如廠商能在標准實現上做得更加規范,則J2ME的跨平台特性會發揮得更加淋漓盡致,繼續保有王者地位。本章將從J2ME的體系結構和MIDlet應用程序模型。
什麼是J2ME 學習J2ME以前知道什麼是J2ME是非常重要的。J2ME是SUN公司針對嵌入式、消費類電子產品推出的開發平台,與J2SE和J2EE共同組成Java技術的三個重要的分支。J2ME實際上是一系列規范的集合,由JCP組織制定相關的Java Specification Request(JSR)並發布,各個廠商會按照規范在自己的產品上進行實現,但是必須要通過TCK測試,這樣確保兼容性。比如MIDP2.0規范就是在JSR118中制定的。可能接觸過J2ME的開發者會覺得說J2ME是一系列的規范不准確吧。因為我們在開發中用到了很多例如CLDC(Connected Limited Devices Configuration)和MIDP(Mobile Information Devices Profile)等內容。其實這並不矛盾,因為這些就是在相關規范中制定的。假如你還沒有很好的理解這個問題,沒有關系,請繼續往下面看,我們開始熟悉J2ME平台的體系結構。
J2ME平台體系結構 J2ME平台是由配置(Configuration)和簡表(Profile)構成的。配置是提供給最大范圍設備使用的最小類庫集合,在配置中同時包含Java虛擬機。簡表是針對一系列設備提供的開發包集合。在J2ME中還有一個重要的概念是可選包(Optional Package),它是針對特定設備提供的類庫,比如某些設備是支持藍牙的,針對此功能J2ME中制定了JSR82(Bluetooth API)提供了對藍牙的支持。
目前,J2ME中有兩個最主要的配置,分別是Connected Limited Devices Configuration(CLDC)和Connected Devices Configuration(CDC)。他們是根據設備的硬件性能進行區分的,例如處理器、內存容量等。由於這個標准是在2001年的時候指定的,而現在移動終端的處理能力和內存容量發展很快,假如還按照這個標准來評判可能就不准確了。 因此我們只是列出標准,供讀者參考。本教程將主要講解基於 CLDC的J2ME平台的相關內容。隨著技術和硬件設備的不斷發展,J2ME開發網將逐步推出基於CDC的J2ME平台介紹。
CDC的硬件參數:
·2M以上內存。
·具有網絡連接能力,通常為無線網絡。
·需要實現java虛擬機規范的全部功能。
·32位或者64位的處理器。
CLDC的硬件參數:
·512 KB 以下內存
·有限能源供給(通常使用電池)
·有限或非持續網絡連接
·簡單的用戶界面
·16位或者32位的處理器
從上述的標准中我們不難看出CLDC主要針對那些資源非常受限的設備比如手機、PDA、雙工尋呼機等。而CDC主要面對那些家電產品,比如機頂盒、汽車導航系統等。簡表是以配置為基礎的,例如Mobile Information Devices Profile(MIDP)就是CLDC上層的重要簡表。與配置的縱向特性不同的是,簡表是橫向的。下圖是J2ME體系結構的框圖:
J2ME體系結構框圖
MIDlet應用程序的生命周期 理解J2ME的體系結構並不像想象的那麼輕易,我們覺得讀更多的資料幫助也不大,我們直接邁向J2ME開發也許會對你理解J2ME平台體系結構這個重要的概念有所幫助。在MIDP中定義了一種新的應用程序模型MIDlet,它是被Application Management Software(AMS)治理的。AMS負責MIDlet的安裝、下載、運行和刪除等操作。在被AMS治理的同時,MIDlet可以和應用治理軟件通信通知應用治理軟件自己狀態的變化,通常是通過方法notifyDestroyed()和notifyPaused()實現的
MIDlet有三個狀態,分別是pause、active和destroyed。在啟動一個MIDlet的時候,應用治理軟件會首先創建一個MIDlet實例並使得他處於pause狀態,當startApp()方法被調用的時候MIDlet進入active狀態,也就是所說的運行狀態。在active狀態調用destroyApp(boolean unconditional)或者pauseApp()方法可以使得MIDlet進入destroyed或者pause狀態。值得一提的是destroyApp(boolean unconditional)方法,事實上,當destroyApp()方法被調用的時候,AMS通知MIDlet進入destroyed狀態。在destroyed狀態的MIDlet必須釋放了所有的資源,並且保存了數據。假如unconditional為false的時候,MIDlet可以在接到通知後拋出MIDletStateChangeException而保持在當前狀態,假如設置為true的話,則必須立即進入destroyed狀態。下圖說明了MIDlet狀態改變情況: