深入理解CLDC/MIDP
CLDC的目的
CLDC的范圍
CLDC不包括的范圍(即由MIDP解決的)
CLDC的安全性
對于Java語言支持的特殊方面 不支持浮點數(shù)據(jù)類型(即沒有float和double)(這實際上主要是由于CLDC所面向的設(shè)備,其硬件因其內(nèi)存限制或是基于安全性的考慮不支持浮點運算) 有限的錯誤處理,即大部分Java.lang.Error的子類都未被支持。與此相反,CLDC包括了相當完備的異常(exception)類。 對于Java虛擬機(Java Virtual Machine)支持的特殊的方面 實質(zhì)上CLDC在其嚴格的內(nèi)存限制下達到了對Java虛擬機相當程度的兼容性。不過還是有下列不同點:
類文件審核過程(classfiles Verification) CLDC要求其下層的虛擬機能夠辨別并拒絕非法的class文件。但由于CLDC本身面向小內(nèi)存消耗的小型設(shè)備這一前提。其類文件檢測機制與J2SE中定義的標準類文件審核機制還有所不同。請注意看下圖: 請注意上圖所示CLDC中的預審核(preverification)過程。這是CLDC區(qū)別于通常的類文件審核過程的關(guān)鍵。如上圖所示,當源程序被編譯后,必須被預審核器預審核,然后才能被下載到目標設(shè)備上去。之所以有這一步驟,主要是為了減輕KVM中審核器的負擔,加快審核速度。就像我前文提到的,這是出于對CLDC支持的硬件的考慮(畢竟手機和PDA并沒有我們PC機那樣奔騰的“芯”呀!^-^)。這里記住這個概念就行了。具體的操作方法我會在以后講述編寫MIDlet程序時介紹。
CLDC的類庫API
如果不嚴格的說,CLDC的類庫是J2SE的一個小的子集,有以下這種近似關(guān)系成立,即J2SE包含CDC包含CLDC。但要注意CLDC并未完全包含于J2SE,它還包括一些專門針對無線設(shè)施的類。所以可以把CLDC的類庫簡要劃分為兩部分:從J2SE繼承的類和CLDC專有的類。 1. 從J2SE繼承的類 這部分包括三個package,即java.lang,java.util和java.io。注意即使這些從J2SE繼承的的類,也是大大“縮了水”的。例如java.util的類與接口由J2SE的47個縮減到10個。另外兩個也有相應(yīng)縮減。 2. CLDC專有的類
MIDP對應(yīng)的設(shè)備特性由于MID這類設(shè)備,在屏幕、內(nèi)存、處理器等問題上有諸多限制,在手機或是PDA等MID上開發(fā)應(yīng)用程序必須要考慮一些技術(shù)上的特殊點。
下面給出一些MID設(shè)備的特性:
還有很多軟件上的特性,如讀寫non-volatile內(nèi)存(就是掉電后不會失去內(nèi)容的內(nèi)存,如flash)。讀寫無線設(shè)備接口的API,等等。除了上訴技術(shù)上的問題,你還得注意你的程序要簡單易用且穩(wěn)定可靠。尤其是可靠性,你開發(fā)的是通訊設(shè)備,用戶是不能忍受程序有什么紕漏而影響到通話的。你要牢記這一點。 MIDP的類庫API
如前文所述,sun在CLDC之上定義了MIDP(Mobile Information Device Pro-file)層,用以提供對UI、永久存儲介質(zhì)(persistinace storage)、和網(wǎng)絡(luò)等更高層的(相對于CLDC)支持。那么,讓我們來具體看看MIDP的類庫。
注:如果在加上語言和實用類(java.lang和java.util)則有六個。
編寫并運行一個MIDletMIDPlet簡介 圖4 MIDlet的繼承體系 一個簡單的MIDlet
該程序顯示“HelloWorld”字符串。程序本身非常簡單,如果你熟悉JavaApplet編程的話,你會發(fā)現(xiàn)與Applet很類似。好,我們先把它編譯,運行一下看看。
編譯之前的準備:
下載好后,先安裝JDK1.3,(具體關(guān)于安裝和設(shè)置我就不詳述了,想來大家都很清楚。如果您不清楚,請參考相應(yīng)資料。)在安裝J2ME Wireless Toolkit 1.0.3,它會自動找到您的JDK1.3,并作相應(yīng)設(shè)置。如果您不用命令行的話,環(huán)境變量也不用設(shè)置直接可在圖形界面上運行,非常方便。關(guān)于環(huán)境變量的設(shè)置請自己參考手冊。 編譯的步驟 (注:下述默任JDK安裝在c:\JDK1.3,J2ME Wirless Toolkit 安裝在c:\J2mewtk\) 1. 開始->程序->J2ME Wirless ToolKit 1.0.3->KToolBar 2. 這時會出現(xiàn)"J2ME Wirless ToolKit"窗口,點"New project"按鍵,在Project name項填:HelloWorld;在MIDLet Class Name填:HelloWorld。點擊Creat project。 3. 這時會出現(xiàn)Setting for project對話窗,采取默認即可。點擊ok。
MIDlet的lifecycle
我們已經(jīng)成功編譯并運行了一個簡單的MIDlet程序?,F(xiàn)在,讓我們來分析一下MIDlet的結(jié)構(gòu),了解一下它的Lifecycle。 通過對源程序的觀察,我們可以發(fā)現(xiàn)MIDlet程序的運行是由startApp(),pauseApp()和destroyApp()這3個方法控制的。它們在javax.microedition.midlet 顧名思義startApp()方法用于標志一個MIDlet的開始執(zhí)行。不過這里要注意一點,與HelloWorld程序的constrctor不同。startApp()不光是在初始化完一個MIDlet時執(zhí)行,只要該MIDLet被從Paused態(tài)激活(變?yōu)锳ctive態(tài)),startApp()就會被調(diào)用。 pauseApp()方法標志著MIDlet進入Pause態(tài)。而destroyApp()方法標志著MIDlet進入destroyed態(tài)。(注意:這里嚴格的講應(yīng)該說成:方法被調(diào)用并成功返回標志著...) MIDlet的執(zhí)行是通過Application Management software來管理的。這玩意兒是處在操作系統(tǒng)級別上來管理MIDlet運行的底層機制的總稱,所謂MIDlet state(MIDlet狀態(tài))就是它一手操辦,控制管理的。MIDlet state確保了AMS隨時可以消滅該MIDlet,同時MIDlet也有辦法進入一個Pause態(tài),并可再次激活。 MIDlet State 分為Paused,Active,destroyed三種。當AMS創(chuàng)生一個新的MIDlet實體時,對應(yīng)于MIDlet,表現(xiàn)為其constructor被調(diào)用,進入Paused狀態(tài)。當所有的準備工作都做好后,AMS判斷現(xiàn)在MIDlet可以運行了,于是調(diào)MIDlet.startApp()方法。進入Active態(tài)。當AMS決定要把MIDlet轉(zhuǎn)入Paused態(tài),就會調(diào)用MIDlet.pauseApp()方法,MIDlet就會暫停執(zhí)行,通常Paused態(tài)會用于釋放所占資源。當AMS判斷MIDlet不再需要,就會調(diào)用MIDlet.destroyApp(),MIDlet被消滅。 請注意我上述是站在AMS的角度在談AMS如何控制MIDlet的狀態(tài)改變。程序員也可請求MIDlet的狀態(tài)的變換,通過調(diào)用resumeRequest, notifyPaused, notifyDestroyed這三個方法。 我們的HelloWorld程序先把destroyApp()的unconditional值置為false,拋出一個MIDletStateChangeException 異常,表示MIDlet這時還不想被destroy。notityDestroyed()通知AMSMIDlet進入destroyed態(tài)。具體的細節(jié)請參閱MIDP API文檔。 下面給出一個MIDlet的最簡單的狀態(tài)流程:
MIDlet的狀態(tài)的改變可以用下圖表示:
這里還要說幾句閑話,關(guān)于AMS,其作用不止是控制MIDlet的運行狀態(tài)。它實際上際上負責了MIDlet的整個運行機制。關(guān)于AMS進一步的描述,請參見王森老師的文章-“利用Java撰寫手機應(yīng)用-Java Application Manager篇”(《程序員》,12期,2001)。注意其中JAM就是AMS。 結(jié)束語好了,J2ME(CLDC/MIDP)的簡介就算是結(jié)束了。把帖子轉(zhuǎn)成html實在是一項很累的工作。試過這后我才明白這個道理。如果您看過之后,有那么一點幫助的話,那就算是對我最大的報償了。如果您覺得文章有什么錯漏之處,或是有什么感想,歡迎給我E-mail。
|
|
來自: Taylor > 《B2B商務(wù)》