在J2ME編程過程中,MIDlet是最核心的類之一,熟悉該類的使用是J2ME學習過程中必須首先掌握的類,下面就結(jié)合實際介紹一下該類的實際使用。
眾所周知,J2ME程序都是從MIDlet類開始執(zhí)行,系統(tǒng)規(guī)定了MIDlet的生命周期。規(guī)定MIDlet程序有三種狀態(tài):
1、 暫停狀態(tài)
2、 運行狀態(tài)
3、 銷毀狀態(tài)
系統(tǒng)在執(zhí)行MIDlet程序時,首先構(gòu)造一個MIDlet類型的對象,然后使程序進入到暫停狀態(tài),按照生命周期的規(guī)定,系統(tǒng)會自動調(diào)用MIDlet對象的startApp方法使程序進入到運行狀態(tài),開始程序的執(zhí)行。如果在創(chuàng)建MIDlet對象的過程中,或者是調(diào)用startApp的方法中發(fā)生了異常,則系統(tǒng)會自動調(diào)用MIDlet對象的destroyApp方法進行到銷毀狀態(tài),也就是使程序退出。
所以生命周期中的第一個需要注意的地方就是熟悉在以上狀態(tài)轉(zhuǎn)換過程中,系統(tǒng)會自動調(diào)用的方法,然后在實際編寫MIDlet類的時候,在這些方法中書寫合適的代碼,這樣就可以在系統(tǒng)規(guī)定的狀態(tài)轉(zhuǎn)換時,自動調(diào)用這些方法。
另外一個需要說明的狀態(tài)是暫停狀態(tài),系統(tǒng)在程序運行過程中,如果手機有來電,則系統(tǒng)會自動的使MIDlet程序進行到暫停狀態(tài),在進入到暫停狀態(tài)以前,系統(tǒng)會自動調(diào)用MIDlet對象的pauseApp方法。當電話接聽完畢以后,系統(tǒng)會自動使 MIDlet程序進行到運行狀態(tài),在進入到運行狀態(tài)以前,系統(tǒng)還會自動調(diào)用startApp方法使系統(tǒng)進入到運行狀態(tài)。
對于上面的內(nèi)容做一個簡單的總結(jié):
1、 startApp方法
在系統(tǒng)第一次運行的時候,系統(tǒng)會自動調(diào)用該方法使系統(tǒng)進入到運行狀態(tài)。
當系統(tǒng)從暫停狀態(tài)切換到運行狀態(tài)以前,系統(tǒng)也會自動調(diào)用該方法。
2、 pauseApp方法
當系統(tǒng)從運行狀態(tài)切換到暫停狀態(tài)以前,會自動調(diào)用該方法。
3、 destroyApp方法
當系統(tǒng)發(fā)生異常退出程序以前,會自動調(diào)用該方法。該方法有一個boolean類型的參數(shù),如果該參數(shù)為true則代表該方法必須清理和釋放資源,如果為false可以拋出一個MIDletStateChangeException異常來表明它不想立即退出。
熟悉了這幾個方法的使用以后,可以實現(xiàn)很多實用的功能,下面介紹兩個實際功能的實現(xiàn):
1、 實現(xiàn)來電話時暫停的功能
在實際的MIDlet編程中,必須實現(xiàn)手機來電時暫停程序的功能,如果有線程時,還需要把線程停止掉,然后當電話結(jié)束以后,重新顯示界面,并重新啟動線程。
startApp方法的具體的實現(xiàn)代碼框架如下:
public void startApp() { //獲得當前顯示的界面 Displayable curr = display.getCurrent(); //判斷是否是第一次運行 if (curr == null) { //顯示第一個界面,例如logo界面 } else { //顯示來電以前的界面 display.setCurrent(curr); //如果需要,還可以啟動線程 }}
如果游戲界面中有線程,則需要在來電時暫停線程,而pauseApp在暫停以前會被系統(tǒng)調(diào)用,所以可以在pauseApp方法中實現(xiàn)該功能。pauseApp方法的實現(xiàn)代碼框架如下:
public void pauseApp() { //獲得當前顯示的界面 Displayable curr = display.getCurrent(); //判斷是否是游戲界面 if (curr instanceof GameCanvas) { //停止線程 }}
2、 實現(xiàn)按掛機時清理的功能
熟悉MIDlet編程的人都知道,在程序運行過程中按掛機鍵,可以使MIDlet程序退出,在低級用戶界面編程中,可以在keyPressed方法中捕獲該事件,但是卻無法處理,因為捕獲以后,程序就直接退出了。
如果游戲中有背景音樂等,則當按掛機鍵直接退出的時候,音樂還會存在,這樣就會造成很多的問題。但是按掛機鍵以后,在程序退出以前,系統(tǒng)會自動調(diào)用destroyApp方法,所以可以把最后處理的代碼放置在destroyApp方法中。
下面接著來看一下另一組方法,來繼續(xù)熟悉MIDlet類的使用:
1、 notifyPaused
使程序進入暫停狀態(tài)
2、 notifyDestroyed
是程序進入到銷毀狀態(tài)。
以上兩個方法和上面的三個方法不同,上面的三個方法是在狀態(tài)切換過程中,會自動被系統(tǒng)調(diào)用。而這兩個方法不會被系統(tǒng)自動調(diào)用,但是程序員在實際編程過程中可以手動調(diào)用這兩個方法,使程序進入指定的狀態(tài)。
比如如果想實現(xiàn)程序退出的功能,就只需要使MIDlet程序進入到銷毀狀態(tài)即可,也就是只需要手動調(diào)用notifyDestroyed方法即可。
上面是MIDlet類中最主要的兩組方法,下面分MIDP1.0和MIDP2.0來分別介紹剩下的方法的作用。首先看一下MIDP1.0中的兩個方法:
1、 getAppProperty
獲得jad文件和manifest文件中屬性的值,如果一個屬性在以上兩個文件中都包含,則以jad文件中的屬性值為準。
2、 resumeRequest
系統(tǒng)通過調(diào)用該軟件來判斷是否需要使該MIDlet進入運行狀態(tài)。如果需要進入運行狀態(tài),則系統(tǒng)會自動調(diào)用startApp方法。
在MIDP2.0中,MIDlet類中新增了兩個方法,下面介紹一下這兩個方法的作用,依次是:
1、 checkPermission
該方法是MIDP2.0的安全許可機制,在程序的實際使用過程中,可以通過該方法來檢查MIDlet是否允許特定的操作,例如聯(lián)網(wǎng)、發(fā)送短信息等等。
如果不允許該操作則返回0,允許返回1,未定義則返回-1。
2、 platformRequest
使用該方法可以訪問某些系統(tǒng)功能,例如通用的功能主要有兩種
使系統(tǒng)打開瀏覽器訪問某個特定的網(wǎng)址:
platformRequest(“http://wap.sina.com.cn”);
這個功能可以實現(xiàn)用來實現(xiàn)提示用戶下載新的程序版本等功能。
使手機撥打特定的電話號碼:
paltformRequest(“tel:1860”);
則系統(tǒng)會自動利用手機來撥打1860。