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 —— 文件打开模式异常,当试图写入以只读方式打开的文件时,会抛出该异常。