2.4 HelloWorld MIDlet
這個 MIDlet 也會在 MIDP 設備的顯示屏上顯示 "Hello World!" 和 Exit 按鈕,按下該按鈕會終止應用程序。
HelloWorld.java 文件以下面的代碼行開始,這些代碼行導入稍後會在 HelloWorld 類中使用的類:
import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
由於 HelloWorld 類是一個 MIDP 應用程序,它擴展了 MIDlet。它也實現 CommandListener 接口來處理事件:
public class HelloWorld extends MIDlet implements CommandListener
下面的方法是一個缺省構造程序,它創建一個新表單,在上面初始化控件,然後顯示出來:
private Form form;
public HelloWorld() {
// Create a new form on which to display our text
form = new Form("Test App");
// Add the text "Hello World!" to the form
form.append("Hello World!");
// Add a command button labeled "Exit"
form.addCommand(new Command("Exit", Command.EXIT, 1));
// Register this object as a commandListener
form.setCommandListener(this);
}
調用 startApp() 方法啓動應用程序與小應用程序的啓動方法很象。在 MIDle 的一次執行中它可能會被調用多次。如果 MIDlet 暫停,pauseApp() 將會被調用。要重新啓動 MIDlet,需調用 startApp()。僅須執行一次的主初始化代碼應該放置在構造程序中:
public void startApp()
{
// Get a reference to the display, and show the form
Display display = Display.getDisplay(this);
display.setCurrent( form );
}
pauseApp() 被調用使得 MIDlet 處於暫停狀態。在此應用程序中,當進入暫停狀態時,我們沒執行任何操作;但是我們仍然需要在 MIDlet 中實現 pauseApp 方法,因爲它是父 MIDlet 類中的抽象方法。
public void pauseApp() { }
destroyApp() 被調用,破壞了 MIDlet 並使其處於銷燬狀態。在此應用程序中,我們通過將引用設爲 null,釋放了對錶單的引用。
public void destroyApp(boolean unconditional)
{
form = null;
}
commandAction() 方法是事件處理程序,被請求實現 CommandListener 接口。目前,它破壞了應用程序並通知應用程序管理軟件 MIDlet 已經完成。
public void commandAction(Command c, Displayable d)
{
// Destroy this MIDlet
destroyApp(true);
// Notify the application management software that this MIDlet
// has entered the destroyed state
notifyDestroyed();
}
2.5 MIDP 軟件包
除標準 CLDC 軟件包之外,MIDP 還包含三個附加的軟件包:
· javax.microedition.lcdui -- 定義用來控制 UI 的類。這個軟件包既包含高級 UI 類(例如 Form、Command、DateField 和 TextField 等),又包含低級 UI 類(允許用低級方式控制 UI)。
· javax.microedition.midlet -- 包含 MIDP 主類中的一個,MIDlet 類,爲 MIDP 應用程序提供訪問關於其運行所在環境信息的權限。
javax.microedition.rms -- 定義一個類的集合,這些類爲 MIDlet 提供了永久存儲並隨後重新得到數據的機制。
2 具體API集差異
在本章的第一部分,通過對J2ME的cldc配置和mdlp簡表的介紹,我們已經瞭解了很多J2ME的編程和J2SE的差異。在這一部分,我們將通過對具體各種類型的API功能編程的不同,來比較和分析這兩種開發模式的差異。
2.1 In/Out
這裏是標準J2ME的io規範
初看到J2ME的版本,也許你會覺得很意外,因爲比起J2SE的版本,IO的功能要弱化很多。
下面這張圖是標準J2SE的IO框架,如果要查詢J2SE的具體的IO輸入輸出的類別,可以參考Sun的javadoc api文檔。
2.2 String操作
一般說來,J2ME和J2SE的string操作差別不大,但是正如前面第二章提到過的,JVM和KVM的差異以及兩個平臺的API不同,有些時候有些很細微的差異,雖然兩個平臺都有String和Stringbuffer的類別,但是string的split/replaceall方法,在J2ME中是不支持的。
所以在編制具體應用的時候,如果發現有些類別方法不工作,就需要考慮自己構造一個實現。
如下是J2SE的API方法截圖:
這裏就是一個在J2ME中分割split方法的實現。
/**
* 分割字符串,原理:檢測字符串中的分割字符串,然後取子串
* @param original 需要分割的字符串
* @paran regex 分割字符串
* @return 分割後生成的字符串數組
*/
private static String[] split(String original,String regex)
{
//取子串的起始位置
int startIndex = 0;
//將結果數據先放入Vector中
Vector v = new Vector();
//返回的結果字符串數組
String[] str = null;
//存儲取子串時起始位置
int index = 0;
//獲得匹配子串的位置
startIndex = original.indexOf(regex);
//System.out.println("0" + startIndex);
//如果起始字符串的位置小於字符串的長度,則證明沒有取到字符串末尾。
//-1代表取到了末尾
while(startIndex < original.length() && startIndex != -1)
{
String temp = original.substring(index,startIndex);
System.out.println(" " + startIndex);
//取子串
v.addElement(temp);
//設置取子串的起始位置
index = startIndex + regex.length();
//獲得匹配子串的位置
startIndex = original.indexOf(regex,startIndex + regex.length());
}
//取結束的子串
v.addElement(original.substring(index + 1 - regex.length()));
//將Vector對象轉換成數組
str = new String[v.size()];
for(int i=0;i<v.size();i++)
{
str[i] = (String)v.elementAt(i);
}
//返回生成的數組
return str;
}
2.4 File I/O
在J2ME中File操作作爲JSR75的一部分,被轉移到了javax.microedtion.io.file下面,如下圖所以。
不同於標準java中的io下大量的文件操作支持,J2ME中的文件操作主要是針對移動設備的具體需求
Javax.microedition.io.file —— 提供對本地文件系統的訪問功能
ConnectionClosedException —— 當試圖對一個已經關閉的 FileConnection 對象進行操作時,會拋出此異常。
FileConnection —— 這是一個很關鍵的類,基本上文件讀寫都是有該類完成。可以從字面上去理解它的意思。
FileSystemEventHandler ——事件偵聽。
FileSystemListener —— 用於監聽文件系統目錄狀態的變化,比如文件的刪除、新增,存儲卡的拔出和插入等。
FileSystemRegistry —— 用於管理和跟蹤文件系統的監聽器,以及可以通過此類過去當前所有文件系統的根目錄。
IllegalModeException —— 文件打開模式異常,當試圖寫入以只讀方式打開的文件時,會拋出該異常。