站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2ME 专题使用Eclipse为Nokia手机开发移动应用程序(2)[转贴]

使用Eclipse为Nokia手机开发移动应用程序(2)[转贴]

摘要: 使用Eclipse为Nokia手机开发移动应用程序(2)[转贴]
作者:Yuan, Mi… 文章来源:IBM

Eclipse 的新的类向导




尽管 Nokia 插件为生成新的类在 Tools > Nokia Developer's Suite for J2ME中提供了一个向导,但我更喜欢使用 Eclipse 的默认向导,因为它支持超类和已实现接口的自动代码完成(automatic code completion)。

图 13. 新类


从该向导中生成的主要 Java 源代码文件如下所示:

图 14. 生成的源代码


TutorialMidlet 类




TutorialMidlet 类是为应用程序提供输入执行的类。Java 运行时环境(Java Runtime Environment,JRE)首先会实例化这个类,然后调用其 startApp() 方法启动 midlet。在用户终止应用程序时,可以调用 destroyApp() 方法。

TutorialMidlet 类控制并显示应用程序中的所有 UI 屏幕。所有用户生成的软键(soft-key)事件(比如用户按下一个软键时)都由 TutorialMidlet 类处理,因为它实现了 CommandListener 接口,并将自己作为所有屏幕对象的命令监听程序附加到该接口上。UI 事件回调方法是 commandAction()。


package tutorial;

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class TutorialMidlet extends MIDlet
implements CommandListener {

Display display;
Command greetCommand;
Command exitCommand;
Command clearCommand;
Command backCommand;
WelcomeScreen welcomeScreen;
HelloScreen helloScreen;

// instantiate the internal variables
public TutorialMidlet () {
display = Display.getDisplay(this);
greetCommand =
new Command ("Greet", Command.OK, 0);
exitCommand =
new Command ("Exit", Command.EXIT, 0);
clearCommand =
new Command ("Clear", Command.CANCEL, 1);
backCommand =
new Command ("Back", Command.SCREEN, 1);

welcomeScreen = new WelcomeScreen ();
welcomeScreen.addCommand (greetCommand);
welcomeScreen.addCommand (clearCommand);
welcomeScreen.setCommandListener (this);

helloScreen = new HelloScreen ();
helloScreen.addCommand (exitCommand);
helloScreen.addCommand (backCommand);
helloScreen.setCommandListener (this);
}

// Called when the MIDlet is started by the AMS
protected void startApp () {
display.setCurrent (welcomeScreen);
}

protected void pauseApp () {
// Do nothing
}

protected void destroyApp (boolean unconditional) {
notifyDestroyed ();
}

public void commandAction (Command c, Displayable d) {
if (c == greetCommand) {
String name = welcomeScreen.getName ();
helloScreen.setName(name);
display.setCurrent (helloScreen);

} else if (c == clearCommand) {
welcomeScreen.setName("");
display.setCurrent(welcomeScreen);

} else if (c == backCommand) {
display.setCurrent (welcomeScreen);

} else if (c == exitCommand) {
destroyApp (true);
}
}
}

实时错误检验
TutorialMidlet 类使用 WelcomeScreen 和 HelloScreen 类,这些类您也必须键入。Eclipse 中的高级 Java 编辑器会用红色线条(red bar)标出相关的代码路径,警告您存在这类冲突。如果您将鼠标放在红线上,编辑器会显示一个解释框,告诉您为什么它认为这是一个错误。实时语法检验允许开发人员利用 Java 编译器的一致性检验功能,而不用实际等待编译的完成。

图 15. 实时错误检验

如果选定 Eclipse Project 菜单中的 Build automatically 选项,那么每当更新项目时,Eclipse 都会试着不断在后台构建该项目。在这种情况下,Package Explorer 也会显示在构建过程中检测到的编译错误。

图 16. 自动构建错误

WelcomeScreen 类 WelcomeScreen 类扩展了 Form 类来展示包含一些高级 MIDP UI 组件的屏幕。正如您已经看到的,WelcomeScreen 的软键命令和事件处理程序被添加在 TutorialMidlet 类中。可以通过 JavaBeans 风格的 get 和 set 方法,从这个类的外部访问 nameField UI 组件中的数据。以这种形式使用的图像来自外部的 PNG 图像文件 welcome.png。该文件必须位于 midlet 的运行时类路径中,以便对它进行访问。
package tutorial;

import javax.microedition.lcdui.*;

public class WelcomeScreen extends Form {

private TextField nameField;

public WelcomeScreen () {
super ("Welcome");

Image img;
// Construct the image from the media file
try {
img = Image.createImage("/welcome.png");
} catch (Exception e) {
e.printStackTrace ();
img = null;
}
ImageItem imageItem =
new ImageItem ("", img,
ImageItem.LAYOUT_CENTER, "Welcome");

nameField =
new TextField ("Please enter your name", "",
10, TextField.ANY);

append (imageItem);
append (nameField);
}

public void setName (String n) {
nameField.setString (n);
}

public String getName () {
return nameField.getString ();
}
}

HelloScreen 类 HelloScreen 类扩展了Canvas 类来展示必须通过应用程序自身得到渲染的屏幕。paint() 方法重新绘制了整个屏幕,每次屏幕需要更新时,都由系统调用该方法。再次声明,HelloScreen 的软键命令和事件处理程序被添加在 TutorialMidlet 类中。屏幕上渲染的名称字符串是通过 setName() 方法在显示该屏幕之前设置的。图像文件 hello.png 也必须位于 midlet 运行时类路径中。
package tutorial;

import javax.microedition.lcdui.*;

public class HelloScreen extends Canvas {

private int width, height;
private String name;
private Image img;

public HelloScreen () {
width = getWidth ();
height = getHeight ();
name = "unknown";

// Construct the image from the media file
try {
img = Image.createImage("/hello.png");
} catch (Exception e) {
e.printStackTrace ();
img = null;
}
}

public void setName (String n) {
name = n;
}

// Paint the screen based on the name
protected void paint (Graphics g) {
g.setColor(0xffffff);
g.fillRect(0, 0, width, height);
g.setColor(0x000000);

g.drawImage (img, width / 2, height / 4,
Graphics.VCENTER | Graphics.HCENTER);

g.setFont(Font.getFont(
Font.FACE_PROPORTIONAL,
Font.STYLE_BOLD,
Font.SIZE_LARGE));
g.drawString (name, width / 2, height * 3/4,
Graphics.BASELINE | Graphics.HCENTER);
}
}

不再有错误 键入所有的源代码,如果 Eclipse 没有显示任何错误或不一致,您就已经为运行 midlet 做好了准备!

图 17. 没有错误,运行 midlet

复制资源文件
WelcomeScreen 和 HelloScreen 类使用了两个外部图像文件。这两个文件都必须位于 midlet 的运行时类路径中。不幸的是,从 Eclipse IDE 内部访问运行时类路径(项目中的 bin 目录)不是一件很容易的事;必须从 IDE 的外部复制这些文件。
图 18 展示了 Windows 文件浏览器中的 bin 目录。

图 18. 复制资源文件

运行 midlet 要在仿真器中运行 midlet,首先要在 Package Explorer 中选择目标 MIDlet 类(这里是 TutorialMidlet类),然后选择 Run > Run As > Nokia SDK。

图 19. 运行 midlet 查看操作中的仿真器

正如配置中所指定的那样,仿真器是从一个诊断窗口开始的。

图 20. 从一个诊断窗口开始的仿真器 该仿真器响应用户的输入。

图 21. 响应用户输入的仿真器

设置调试器
Nokia 设备 SDK 提供了有限的调试功能。您可以使用 Eclipse 的插件调试器
来收集调试信息,并与 SDK 仿真器进行交互。
首先,您必须在 Windows > Preferences 窗口中设置调试器。您应该取消
所有处于挂起状态的选项的选定,并将调试器的超时时间增加到 20,000 毫秒。
图 22. 设置调试器


设置中断点
使用 Eclipse 的 Run 菜单,您可以设置中断点,并在源代码编辑器中
观察游标所在位置上的中断点。因为 Nokia SDK 中有一个 bug,
进入方法可能导致仿真器崩溃,所以,您应该只设置方法中断点。

图 23 显示了一个方法中断点,该中断点正如编辑器左边绿色点所指出的那样。
为了使其生效,您还必须为该中断点重新构建应用程序。
图 23. 设置一个中断点

运行调试器
现在,您可以使用 Run > Debug ... 在调试模式下运行 midlet。仿真器启动正常,
但当您击中该中断点的时候(比如说这里按下软键来调用方法处理程序的 commandAction() 方法),
Eclipse 会将它的显示从 Java 透视图更改为调试透视图。它将显示调用堆栈、
当前中断点和堆栈中的变量值。在回顾了这些数据之后,您就可以使用 Run 继续您的执行操作。
图 24. 调试透视图


生成 JAR 和 JAD 文件
为了在实际的硬件设备上运行 midlet,必须将它们打包到 JAR 和 JAR 描述符(JAD)文件对中,
这两个文件是随 J2ME 空中下载(Over-The-Air,OTA)应用程序自动配置规范一起提供的。
可以使用 Tools > Nokia Developer's Suite for J2ME >
New Application Package 向导来生成 JAR 和 JAD 文件。
您可以选择生成新的文件对,或者编辑现有的文件对。
图 25. 新的 JAR 和 JAD 文件对


定制属性
您可以在 JAD 和 JAR 清单文件中定制 midlet 名称、描述、版本号和其他许多属性,
其中包括用户定义的属性。
您还可以控制 JAR 文件中包含哪些类和资源文件。
图 26. 编辑 JAR/JAD 属性

预览 JAR/JAD 文件
单击 Preview 来预览 JAD 和 JAR 清单文件。
图 27. 预览 JAR/JAD 清单文件

生成文件
单击 Generate 来实际地生成 JAD 和 JAR 文件。您可以在项目根目录中替换生成的文件。
图 28. 生成实际的 JAR/JAD 文件

为包签名
使用 Tools > Nokia Developer's Suite for J2ME >
Sign Application Package 向导,
可以对 midlet 进行数字签名,以便将其发布。该向导允许您导入自己的数字证书。
它为 JAR 清单和 JAD 文件添加了数字签名和相关的公钥证书。
图 29. 为应用程序包进行签名

测试仿真器中的包
使用 Tools > Nokia Developer's Suite for J2ME
> Start Emulators 向导,
您可以在设备仿真器中测试运行 JAD 文件。这个 JAR 文件在 JAD 文件中提到过。
您可以对相同的 midlet 启动多个仿真器实例。每个仿真器实例都有一个不同的假的电话号码。
图 30. 为进行测试而运行 JAD 文件


在仿真器中测试 OTA
使用 Tools > Nokia Developer's Suite for J2ME > Start Emulators 向导,
您还可以在设备仿真器中测试 JAD 和 JAR 文件的 OTA 配置。仿真器试图从 URL 安装 JAD 文件,
并通过安全和权限检验来查看它是否是一个 OTA midlet,而不用直接运行 JAD 文件。
图 31. 测试 JAR/JAD 文件的 OTA 配置


在局域网上进行部署
有了 JAR 和 JAD 文件,您就可以使用 Tools > Nokia Developer's Suite for J2ME
> Deployment 向导,
通过串行连接和蓝牙连接将它们推(push)向电话。被推的(pushed)应用程序将安装在电话上。
图 32. midlet 的局域网安装


在 OTA 服务器上进行部署
为了将 midlet 推向本地串行网络和蓝牙网络之外的一般公众,
必须在公共 OTA 服务器上放置 JAD 和 JAR 文件,
这样,任何移动用户都可以通过无线数据网下载和安装它。
该部署向导支持使用 FTP 将这些文件复制到将 OTA 服务器作为主机的 ISP。
它自动生成一个 WML 文件,
该文件包含到 JAD 文件的链接。当移动用户通过电话或者单击该链接,
从他们自己的 WML 浏览器访问这个 WML 页面时,
会自动触发电话安装 midlet。

图 33. 将 midlet 传输到 OTA 服务器









2006-11-26 10:55 PM

↑返回目录
前一篇: 使用图层创建地图
后一篇: 使用Eclipse 为Nokia 手机开发移动应用程序(1)[转贴]