摘 要:簡要介紹了SUN公司的J2ME規範,並通過具體例子說明了MIDP程序的設計方法及開發過程。 中圖分類號:TP312JA 文獻標識碼:B 文章編號:1004-373X(2003)09-057-04 1 引 言 隨着通訊技術的發展及手機的普及,人們正在不斷地給手機增加新的功能,其中,使手機實現一般只有PC機才具有的功能--下載各種程序並運行,是目前手機發展的一個重要方向。爲此,人們提出了各種各樣的解決方案,其中基於JAVA的J2ME方案無疑是最引人注目的。
JAVA語言由於其平臺無關、開放、網絡功能強、面向對象、安全等特點,一經SUN公司提出,就隨着Internet的發展而風靡全世界,在國外已成爲軟件開發人員的必修語言。特別是他的"一次編寫、到處運行"的跨平臺優點,對於手機領域來說更具有重要的意義。因爲目前手機的種類繁多,各種廠商都有自己的標準,如何使他們能運行同一種標準的程序成爲必須要解決的問題。採用JAVA語言後,各種手機只要實現JAVA虛擬機(JVM)就可以運行JAVA程序,這種方法可以說是目前情況下最爲理想的一種解決方案。
J2ME(JAVA 2 Micro Edition)是用於嵌入式系統的JAVA,他是SUN公司對標準的JAVA版本J2SE做了最大程度的精簡後得到的一種JAVA應用程序運行環境,在最簡單的情況下他只有幾十kB,特別適合在手機、PDA等設備中使用。手機廠商如果在自己的手機中實現了J2ME規範,就可以從網絡下載並運行JAVA程序,從而大大擴展了手機的功能。鑑於JAVA在Internet上取得的巨大成功,我們有理由相信,J2ME能夠把這種成功延伸到手持設備領域,爲將來的手機和互聯網融爲一體提供有利的條件。
JAVA手機的出現也給軟件行業提供了新的機遇,能否給JAVA手機提供足夠多的軟件資源是關係到其能否推廣的重要因素之一。本文對J2ME構架做一個簡單的介紹,並通過一個具體的程序例子來說明JAVA手機程序的特點及開發過程。 2 J2ME概述 J2ME是一種新的、非常小的JAVA應用程序運行環境,他所定義的構架主要用於在手持式設備上推廣使用JAVA技術。SUN公司將爲各種硬件規模的設備提供合適的配置,這些配置包括虛擬機、核心類庫及API。目前,J2ME定製了2種配置:CLDC(Connected Limited Devices Configuration)和CDC(Connected Device Configuration)。其中,CLDC是爲手機等CPU和內存資源遠低於標準JAVA要求的設備所提供的一種配置,他是對JAVA標準版本做了最大程度的縮減後得到的,其虛擬機和核心類庫多於100kB。CDC配置主要用於擁有更多資源的下一代設備。
CLDC配置給各種手持設備提供了能運行JAVA程序的一種環境,但開發者還很難在這種環境下開發程序,首先因爲CLDC核心庫提供的是低級API,不適合直接用於構建應用程序;其次,手持設備的系統結構千差萬別,很難保證應用程序的圖形界面、網絡等功能的移植性。因此,爲了進一步增強J2ME的功能,SUN公司允許設備供應商在實現CLDC的基礎上再爲自己的設備提供專門的高級API及程序管理方法,即PROFILE,以簡化應用程序的開發,使程序有更好的移植性。同時,SUN公司還與50多家知名的移動設備製造商及軟件開發商一起,制訂了專門用於手機等移動信息設備的PROFILE--MIDP (MobileInformation Device PrOfile),由於MIDP提供了編寫圖形界面、網絡程序的統一規範,並實現動態、安全的程序管理方法,因此得到了諾基亞、摩托羅拉、西門子等主要手機廠商的支持,紛紛推出了基於MIDP的JAVA手機。
與APPLET相似,MIDP程序也稱爲MIDlet,他必須要繼承一個特定的類--MIDlet,這樣MIDlet管理者才能控制他的運行。這個類包含了startApp,pauseApp,destoryApp三個用戶可以重載的方法,分別在MIDlet進入運行狀態、停止運行、退出時調用。
MIDP程序的圖形接口相對於標準JAVA的AWT接口要簡單得多,他分爲低級API和高級API。低級圖形API使開發者能更直接地控制屏幕顯示和鍵盤輸入,他基於抽象類Canvas,一般用於編寫遊戲程序,他的可移植性要由開發者自己保證。高級圖形API能在不同設備之間有很好的可移植性,但開發者能調整的餘地也相應地很小,他基於抽象類Screen,並有 Alert,Form,List,TextBox四個具體的子類,這4個子類分別表示警示框、表單、列表框、文本輸入框。另外,高級API還提供了許多圖形組件,包括Command,ChoiceGroup, DateFie1d, Gauge, ImageItem,StingItem,TextField等,他們都可以添加到A1ert和 Form中。有些圖形組件還提供了與AWT相似的事件及事件響應處理方式。
MIDP程序一般要和各種資源文件一起壓縮成一個jar文件。發佈時,還需要有一個擴展名爲jad的描述文件,他包含了MIDP程序的名稱、版本、jar文件的位置及大小等信息。JAVA手機首先要訪問的是描述文件,再根據描述文件的信息把MIDP程序安裝到本手機,然後才能運行。 3 開發實例 MIDP程序真實的運行環境是JAVA手機,但他的開發卻是在PC機上進行的,因此開發環境一般都提供仿真器對程序進行測試。各種手機廠商都有自己的開發、測試環境,下面介紹的例子程序,是在SUN公司的MIDP實現中調試通過的。 3.1 程序功能
本例子包含2個MIDP程序,第1個程序運行時要求用戶輸入姓名,並選擇性別,然後程序根據性別和當前時間向用戶輸出一句問候語。第2個程序運行時讓用戶選擇圖片名稱,然後把這幅圖片在屏幕上顯示出來。這2個MIDP程序由同一個描述文件描述。 3.2 程序源代碼及註釋 3.2.1 第1個MIDP程序(samplel.java)
import javax.microedition.midlet.MIDlet;
import javax.microedition.1cdui.*;
import java.util.*; //任何MIDP程序都要繼承MIDlet類,爲了處理按鈕命令,還要實現了CommandListener接口 public class samplel extends MIDlet implements CommandListener
{
private TextBox input; //聲明文本輸入框
private Form select; //聲明表單,用於放置各種圖形組件
private Alert output //聲明警示框
Command cfl,cf2,ct,ca; //聲明各種命令按鈕
ChoiceGroup sex; //聲明選擇框
Display display=null; //聲明屏幕顯示對象
public samplel()
{
input =new TextBox("請輸入您的姓名:",null,8,TextField.ANY); //創建文本輸入框
ct=new Command("OK",Command.SCREEN,1); //創建按鈕ct
input.addCommand(ct); //把按鈕加到文本輸入框
input.setCommandListener(this);//設置按鈕事件處理類
select=new Form("請選擇性別:"); //創建表單
String[]str={"男","女"};
sex=new ChoiceGroup(null,ChoiceGroup.EXCLUSIVE,str,null); //創建單選框,
select.append(sex) //把單選擇框加入表單
cfl=new Command("OK",Command.SCREEN,1);
//創建2個按鈕cf1和cf2
cf2=new Command("回退",Command.BACK,2);
select.addCommand(cf1); //把2個按鈕加到表單
select.addCommand(cf2);
select.setCommandListener(this) //設置按鈕事件處理類
output=new Alert("問候;","您好1",null,null);//創建警示框
output.setTimeout(Alert.FOREVER);//設置超時爲永遠
ca=new Command("退出",Command.EXIT,1);//創建按鈕ca output.addCommand(ca); //把按鈕ca加到警示框 output.setCommandListener(this); //設置按鈕事件處理類 } public void startApp() //該方法在該MIDlet得到執行權時調用
{ if(display==null)
display=Display·getDisplay(this); //從系統得到這個MIDlet的屏幕顯示對象
display·setCurrent(input);//把文本輸入框input顯示在屏幕
} public void pauseApp() {}//該方法在該MIDlet失去執行權時調用 public void destroyApp(boolean unconditional)
//該方法在該MIDlet退出時調用
{
input=null; output=null;select=null;
}
//commandAction方法是CommandListener接口中定義的按鈕事件處理方法 public void commandAction(Command c,Displayable d){ if(c==ct) //如果按了ct按鈕 display.setCurrent(select); //則把表單select顯示在屏幕
if(c==cfl) { //如果按了cfl按鈕
Calendar rightNow = Calendar.getInstance();//得到當前時間 int ti=rightNow.get(Calendar.HOUR_OF_DAY);
//得到當前時間的小時數(24小時制)
int indx=sex.getSelectedIndex();
//得到用戶在單選框中所選的項目號 String helo= null; String name=input·getString(); //得到用戶在文本框中輸入的字符串
//以下4句根據ti和indx的值構建不同的字符串helo
if(ti>=12&&indx==1)helo="上午好!"+name+ "小姐";
if(ti>=12&&indx==0 helo="上午好!"+name+ "先生";
if(ti<12&&indx==1) helo="下午好!"+name+ "小姐";
if(ti<12&&indx==0 helo="下午好!"+name+ "先生";
output.setString(helo);//在警示框中加入字符串helo
display·setCurrent(output);//把警示框output顯示在屏幕
} if(c==cf2 //如果按了cf2按鈕 display.setCurrent(input);//則把把文本輸入框input顯示在屏幕 if(c==ca) { //A0果按了ca按鈕,則調用destroyApp方法退出
destroyApp(true);
notifyDestroyed(); }
}
}
3.2.2 第2個MIDP程序(sample2.java) import javax.microedition.midlet.MIDlet; import javax.microedition.1cdui.*; public class sample2 extends MIDlet implements CommandListener {
private Form form;
private List list' //聲明列表框
Command cl=null;
Display display=null;
String[]dd={"圖像1","圖像2","圖象3"};
public sample2()
{
list=new List("Test List,Choice.EXCLUSIVE,dd,null);
cl=new Command("OK",Command.SCREEN,1); list.addCommand(cl);
list.estCommandListener(this);
} public void startApp()
{
display=Display·getDisplay(this);
display·setCurrent(1ist);
} public void pauseApp() {} public void destroyApp(boolean unconditional) { list=null; } public void commandAction(Command c,Displayable d) {
Image aa=null; //聲明圖像對象aa
if(c==cl) { //用戶按了cl按鈕
int i=list·getSelectedIndex();
//得到用戶在列表框中所選的項目號
try{
//創建圖象對象,圖象文件爲tl.png,t2.png
或t3.png,要和類一起壓縮在jar包中
aa=Image.createImage("/t"+(new Integer(i+l)) .toString()+".png"); }
catch(Exception e){}
Form f=new Form("Test"); //創建表單f
f.append(aa); //在表單中加入圖像
display·setCurrent(f);//把表單顯示在屏幕上
}
}
} 3.2.3 描述文件內容(sample.jad) MIDlet-1;Hello,,samplel
//聲明第1個MIDlet程序,顯示名爲Hello,類名爲samplel MIDlet-2:Image,,sample2
//聲明第2個MIDlet程序,顯示名爲Image,類名爲sample2 MIDlet-Description:Sample application //對MIDlet的描繪 MIDlet-Jar-Size:11640
//Jar包的字節數,要根據實際情況修改 MIDlet-Jar-URL:sample.jar //Jar包的位置及名字,位置省略時表示與jad文件在同一位置 MIDlet-Name:MySamples //MIDlet的名字 MIDlet-Vendor:Sun Microsystems //供應商名字
MIDlet-Version:1.0 //MIDlet版本 3.3 開發過程(WindOWS 2000平臺下)
(1)從SUN公司的網站下載MIDP2.0版(http: va.sun.com/prOducts/midp),並解壓到c:\midp2.0fcs
(2)從SUN公司的網站下載JAVA標準版開發工具JDKl.3.1,安裝在c:\jdkl.3
(3)建一工作目錄,並把上述3個文件存人該目錄
(4)另外再找3個圖像文件,轉化爲png格式後以 tl.png,t2.png,t3.png的名字存入工作目錄
(5)進入MS-DOS方式,轉入工作目錄,設置以下環境變量:
set MIDP_HOME=c:/xmidp2.Ofcs
set PATH=c:/jdkl.3\bin;c:/midp2.Ofcs\bin
set classpath=c:/midp2.Ofcs\classes (6)編譯2個JAVA文件:
javac *.java
(7)用以下命令預先檢查2個類:
preverify-d.sample1
preverify-d.sample2
(8)把有關文件打成1個包:
jar-CVf sample.jar *.pag
(9)在仿真器中運行:
midp-C1asspath.sample.jar-descriptor sam ple.jad
在完成仿真後,可以把sample.jadd和sample.jad放在某一網站,並用以下命令測試: midp-install http://<網絡地址及路徑>/sample.jad
//下載並安裝 midp-run 1 //運行,1表示所安裝的第1個MIDlet 注:①網站的Web服務器要把jadd文件的MIME類型設爲text/Vnd.sun.j2me.app-descriptor,jar文件的MIME類型設爲applicatiOn/java-archive;
②若sample.jad和sample.jar放在不同位置,則sample.jad中的MIDlet-Jar-URL屬性要相應修改;
③可以輸入midp命令,然後用圖形界面進行操作。 4 結 語 MIDP API還提供了HttpConnection類,利用他可以很方便地與互聯網的網站進行交互,從而編寫出功能很強的網絡程序。隨着JAVA手機的普及,迫切需要大量的應用程序資源,各大手機廠商也給開發者提供了非常方便的開發工具,相信MIDP程序的開發在不久的將來能很快地流行起來。 |