本章要点
¿ 熟练使用Netbeans IDE开发MIDlet
¿ 掌握MIDlet应用程序模型和开发流程
¿ 熟练使用WTK和命令行方式开发MIDlet
¿ 搭建OTA下载服务器
上一章主要讲述了J2ME平台的体系结构和主要内容,介绍了J2ME平台两个重要的配置CLDC和CDC及相关的简表。本章主要关注的是如何开发MIDP应用程序。读完本章的内容,读者应该了解MIDP应用程序的开发流程,掌握MIDlet应用程序模型,熟练使用Netbeans IDE和Mobility Pack来开发MIDP应用程序。
Netbeans是一个开源项目,致力于为开发者提供稳定、出色的开发工具。Netbeans IDE和Netbeans平台是netbeans.org的两个著名产品。在编写本书的时候,Netbeans IDE已经被下载了500万次,可见这一集成开发环境受欢迎的程度。目前最为稳定的版本是Netbeans IDE 4.1,虽然已经发布了功能更为强大的Netbeans IDE 5.0 beta版,我们还是推荐开发者使用Netbeans IDE 4.1,同时我们期待Netbeans IDE 5.0正式版的发布。本书的代码全部使用Netbeans IDE 4.1中文版编写,运行操作系统为Windows XP。
Mobility Pack用于开发、测试和调试MIDP应用程序。Mobility Pack 4.1可以和Netbeans IDE 4.1无缝集成,支持CLDC 1.1和MIDP 2.0开发环境。Mobility Pack还可以很容易地与第三方模拟器集成,为开发者提供了所需的运行环境。
关于Netbeans IDE和Mobility Pack的详细信息可以参考http://www.netbeans.org。
2.1 使用Netbeans开发MIDP应用程序
所谓“工欲善其事,必先利其器”。在讲述MIDP应用程序环境和MIDlet应用程序模型之前,我们需要首先搭建起J2ME的开发环境并编写一个简单的MIDlet,这样可以更快地带领读者进入移动开发世界。笔者认为,理解概念与动手实践交替进行有助于更好地掌握这门技术。
2.1.1 安装Netbeans IDE 4.1和Mobility Pack 4.1
1.安装Netbeans IDE 4.1
假设你已经在个人电脑上正确地安装了J2SDK(Java 2 platform Software Development kit),并且Java运行环境可以正常工作。
(1)首先从http://gceclub.sun.com.cn/download.html下载Netbeans IDE 4.1和Mobility Pack 4.1中文版(本书附带光盘中有上述安装软件)。
(2)双击Netbeans IDE 4.1中文版的安装文件,安装系统会首先检查您的Java运行环境是否安装正确。如果正常将进入安装向导界面,如图2-1所示。
(3)接受许可协议中的条款,选择安装目录。这里把Netbeans IDE 4.1安装在C:/Program Files/netbeans目录,如图2-2所示。
图2-1 Netbeans IDE安装向导 图2-2 选择安装目录
(4)单击【下一步】按钮,安装系统会搜索操作系统上已经安装的J2SDK。笔者的计算机安装了J2SDK1.4.2_03,你可以选取其他JDK,方法是键入JDK的安装目录或单击【浏览】按钮找到它,如图2-3所示。Netbeans 4.1需要安装J2SE JDK 1.4.2或更高版本。
(5)单击【下一步】按钮,系统开始安装Netbeans IDE 4.1,如图2-4所示。安装完成后,单击【完成】按钮。
图2-3 选择Java 2标准版JDK 图2-4 正在安装Netbeans IDE 4.1
Netbeans IDE 4.1中文版安装完成后,运行Netbeans IDE,选择菜单【文件】→【新建项目】,我们会发现可供选择的项目类别,包括“常规”、“Web”和“企业”等。这里并没
有用于开发
MIDP
应用程序的项目类别(如图
2-5
所示),这是因为还没有安装
Mobility Pack
。如果读者具有
J2SE
或者
J2EE
的开发经验,不妨先新建几个测试项目熟悉一下Netbeans的运行环境,体验一下这款出色的Java开发工具。接下来我们要安装Mobility Pack 4.1。
图2-5 Netbeans IDE 运行界面
2.安装Mobility Pack 4.1
(1)运行Mobility Pack的安装文件。安装系统首先会检查Java虚拟机安装是否正确,然后进入Mobility Pack安装向导界面,单击【下一步】按钮并接受许可协议中的条款,如图2-6所示。
(2)Mobility Pack是Netbeans IDE上一个附加软件包,因此必须指定Netbeans的安装目录,选择Netbeans IDE 4.1的安装目录C:/Program Files/netbeans,如图2-7所示。
图2-6 接受许可协议条款 图2-7 选择Netbeans安装目录
(3)单击【下一步】按钮,系统将提示安装Mobility Pack,安装完成后关闭安装向导。
现在已经搭建好了开发MIDP应用程序的环境,不用再安装其他任何插件我们就可以开发J2EE与J2ME相结合的项目了。比起安装和配置eclipse的繁琐过程,Netbeans IDE显得更加出色。由于目前Netbeans IDE和Mobility Pack的安装和使用文档较少,因此本节多花了一些篇幅结合插图对其进行了详细的讲解。下面我们使用Netbeans IDE和Mobility Pack开发第一个MIDlet。
2.1.2 使用Netbeans IDE开发MIDP应用程序
本节将通过简单而全面的实例讲解如何使用Netbeans IDE和Mobility Pack来开发MIDP应用程序。由于篇幅有限,这里不可能一一列举Mobility Pack提供的新特性,如无线连接向导、可视化用户界面编辑器等,我们会在后面的章节中逐一讲解。
1.新建项目
新建项目之前,首先在系统的D盘创建一个目录netbeansProj用来存放项目(后面创建项目的时候会用到)。
运行Netbeans IDE,选择菜单【文件】→【新建项目】。首先要选择项目,在类别一栏中选择“移动”,项目一栏中选择“Mobile Application”,如图2-8所示。
单击【下一个】按钮进入名称和位置设置界面。这里我们需要设置项目的名称、位置和所在文件夹。在默认情况下,创建HelloMIDlet是被选中的,这里我们不选择。在项目名称中输入MobileProject,项目位置选择我们在D盘创建的D:/netbeansProj。新建项目成功后,Netbeans IDE会在D:/netbeansProj/MobileProject创建文件夹并存放项目的所有文件,如图2-9所示。
图2-8 选择项目
图2-9 设置项目的名称和位置
单击【下一个】按钮进入平台选择界面。这里需要设置模拟器平台、设备、配置版本和简表版本。这些参数不能随便设置,应该根据项目的需求而定。如果项目基于MIDP 1.0运行环境,而这里选择了MIDP 2.0,这将对以后的工作造成麻烦,当然平台选择以后可以在项目的属性中修改。这里我们选择CLDC 1.0和MIDP 2.0,如图2-10所示。
2.新建MIDlet
我们不准备编写一个HelloWorld类型的MIDlet,而是力图覆盖更多的关于MIDP开发的知识点,同时全面地展示给读者如何使用Mobility Pack开发MIDP应用程序。下面编写的程序是从资源文件读取图片和中文文本,并将其显示在手机界面上。
图2-10 平台选择
首先为MobileProject项目新建一个Java包用于放我们编写的Java源文件,方法是用右键单击“MobileProject”,然后在弹出的快捷菜单中选择【新建】→【Java包】,然后输
入“
com.j2medev.netbeans
”。这样就在
MobileProject
项目中创建了
com.j2medev.netbeans包。
接下来要为MobileProject项目创建资源文件
——一个包含中文的文本文件和png格式的图片。首先切换到文件视图,将新建文件夹命名为res。接着以res作为父文件夹新建两
个子文件夹,分别命名为
images
和
text
。然后把事先准备好的
png
图片复制到
images
文件夹中,使用
Windows
操作系统自带的记事本新建一个文本文件,输入内容“欢迎来到移动开发世界”。值得注意的是,在存储文件时需要将编码格式指定为
UTF-8
(这是大多数手机都支持的编码格式)。如果想为
MIDlet
制作一个代表图标,那么在
res
文件夹下新建一个
icon
文件夹,把
png
格式的图标文件复制到此目录中。
MobileProject
项目结构如图2-11所示。
图2-11 MobileProject项目结构
在编写代码之前,需要把刚才新建的文件夹res加入到项目绑定的资源中,避免出现无法找到资源的问题。如果您在开发过程中遇到无法从Jar包中读取图片的问题,通常是由于项目的捆绑资源设置不正确。解决办法是:在项目视图中,右键单击MobileProject项目,在弹出的快捷菜单中选择【属性】→【库和资源】→【添加文件夹】,把MobileProject下的res目录加入到绑定资源中,如图2-12所示。
图2-12 为MobileProject添加捆绑的库和资源
做好上述准备工作后,开始使用代码编辑器编写MIDlet。切换到项目视图,新建一个MIDlet命名为TurboMidlet,设置MIDlet的图标为/icon/icon.png。TurboMidlet的代码如下所示。
package com.j2medev.netbeans;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class TurboMidlet extends MIDlet implements CommandListener{
private Display display = null;
private Form mainForm = null;
public static final Command exitCommand = new Command("退出",Command.OK, 1);
//startApp()方法是程序的入口,相当于Java应用程序中的main()方法
//startApp()同时是MIDlet的生命周期方法
public void startApp() {
if(display == null){
display = Display.getDisplay(this);
}
mainForm = new Form("TurboMIDlet");
Image img = getImage("JavaPowered-8.png");
mainForm.append(img);
String text = "";
try{
text = getText("j2medev.txt");
}catch(IOException ex){
text = "读取文本出错";
}
mainForm.append("/n"+text);
//为mainForm添加Command,用于与用户交互
mainForm.addCommand(exitCommand);
mainForm.setCommandListener(this);
//将mainForm设置为手机界面的当前显示对象
display.setCurrent(mainForm);
}
private Image getImage(String name){
Image img = null;
try{
//读取images目录下的图片
img = Image.createImage("/images/"+name);
}catch(IOException ex){
ex.printStackTrace();
}
return img;
}
private String getText(String name) throws IOException{
//getResourceAsStream()是将资源文件与java流关联的最好方法
InputStream is = getClass().getResourceAsStream("/text/"+name);
if(is != null){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int ch = 0;
//将文本文件的内容写入到baos开辟的内存中
while((ch = is.read()) != -1){
baos.write(ch);
}
//返回文本文件内容的字节数组
byte[] text = baos.toByteArray();
baos.close();
//由于包含中文,所以编码转换为UTF-8
return new String(text,"UTF-8");
}else{
return null;
}
}
public void pauseApp() {
//在本例中不做任何处理
}
public void destroyApp(boolean unconditional) {
//在本例中不做任何处理
}
public void commandAction(Command cmd,Displayable displayable){
if(cmd == exitCommand){
destroyApp(false);
notifyDestroyed();
}
}
}
右键单击MobileProject,在弹出的快捷菜单中选择【运行项目】,也可以按F6键运行主项目。TurboMidlet的运行界面如图2-13所示。

图2-13 TurboMIDlet运行界面
生成项目后,Netbeans IDE会在项目所在的目录创建dist文件夹,里面是最终的发布软件MobileProject.jar和MobileProject.jad。初学者也许不能完全明白上面的代码,我们会在下面的内容中对MIDlet应用程序模型进行详细的讲解。