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

当前页面: 开发资料首页J2ME 专题仔细研究 J2ME

仔细研究 J2ME

摘要: J2ME 是一个重要的用于无线方面的 Java 平台,它从可移植的、以网络为中心的 Java 虚拟机转变而来

在我们今天的生活中,个性化的智能信息用品已经是必需品。这些用品包括移动电话、双向寻呼机、智能卡、个人电脑记事本(personal organizer)和掌上电脑(palmtop)。它们的趋势是成为目的特定的、资源有限的网络连接设备,而不是我们迄今已知的通用台式机。为专门满足这一巨大的消费空间,Java 2 平台袖珍版(J2ME)提供了极多的创新 Java 技术。

Java VM 的变迁:从台式机到微型设备

作为 J2ME 目标的微型设备具有 16 位或 32 位处理器和总量不少于大约 128 KB 的存储器。这些设备都符合 连接限制设备配置(Connected Limited Device Configuration(CLDC)),同时也保留了 Java 的传统特性,即任何时间、任何地点的代码可移植性、部署灵活性、安全的网络传送以及代码稳定性。J2ME CLDC 的先决条件是一个紧缩的 JVM,称为 K 虚拟机(K Virtual Machine(KVM))。KVM 是为小存储器、资源受限的网络连接设备设计的。

另一个 J2ME 配置是 连接设备配置(Connected Device Configuration(CDC))。它的目标是高档的消费类电子产品和嵌入设备,例如智能通信器、高级“智能”寻呼机、智能个人数字助理(PDA)以及交互式数字电视机顶盒。典型地,这些设备运行一个 32 位的微处理器/控制器,而且有总量大于 2 MB 的用于虚拟机和库的存储的存储器。CDC 包含有 C 虚拟机(C Virtual Machine(CVM))。在本篇文章中,我们将把注意力放在 CLDC 和 KVM 体系结构上。关于 CDC 和 CVM 的更多信息,请参阅下面的 参考资料部分。

为适应占用资源很小的(small-footprint)设备的特性,KVM 已经按以下方式修改:


<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right">回页首</td></tr></table></td></tr></table>

J2ME 体系结构和配置

J2ME 体系结构是基于设备的 系列类别的。一个类别定义了一个特定种类的设备:移动电话、简单寻呼机和电脑记事本都是单独的类别。对存储器和处理能力有相近需求的若干类别的设备构成设备的一个系列。移动电话、简单寻呼机和简单个人电脑记事本一起就是占用资源很小的设备的一个系列。

图 1 定义了在 J2ME 上下文环境中设备的系列和类别之间的关系。



图 1. 设备的系列(family)和类别(category)

为了支持资源受限设备系列所要求的那种灵活性和可定制部署,人们将 J2ME 体系结构设计成模块化的和可伸缩的。J2ME 技术在一个完整的应用程序运行时模型中定义了这种模块性和可伸缩性,在该模型中的四个软件层都构建在设备的主机操作系统上。

图 2 显示了 J2ME 体系结构。



图 2. J2ME 体系结构

Java 虚拟机层(Java Virtual Machine Layer)、配置层(Configuration Layer)和框架层(Profile Layer)一起构成了连接限制设备配置(Connected Limited Device Configuration(CLDC))。MID 框架(MID Profile)和 CLDC 提供了一个标准的运行时环境,这个环境允许把新的应用程序和服务动态地部署在终端用户设备上。


<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right">回页首</td></tr></table></td></tr></table>

用 MIDP API 进行 J2ME 编程:构件

CLDC 和 MIDP 组合起来为创建移动电话和简单双向寻呼机上的应用程序提供了完整的环境。

MID 框架的核心是一个 MIDlet 应用程序。这个应用程序继承了 MIDlet 类,以允许应用程序管理软件对 MIDlet 进行控制、从应用程序描述符检索属性以及对状态变化进行通知和请求。

所有 MIDlet 都继承 MIDlet 类 — 运行时环境(应用程序管理器)和 MIDlet 应用程序代码之间的接口。MIDlet 类提供了用于调用、暂停、重新启动和终止 MIDlet 应用程序的 API。

应用程序管理软件可以在运行时环境内管理多个 MIDlet 的活动。此外,MIDlet 可以自己发起一些状态变化,并把这些变化通知给应用程序管理软件。

MIDP API 类的完整集合可以分为两个类别:

底层的 CLDC API 用于处理字符串、对象和整数。还提供了 Java 2 API 的一个子集,用于处理 I/O 和网络通信。

图 3 显示了 J2ME 的构件。



图 3. J2ME 的构件

标准(Standard)版和袖珍(Micro)版 Java API 之间的关系如图 4 所示。



图 4. J2ME 和 J2SE API 之间的关系

J2ME 中的事件处理

J2ME 中的事件处理是以一系列屏幕显示为基础的,这与 Java 平台的台式机版本的事件处理有很大不同。每一屏显示特定的少量数据。

命令以每屏幕为基础提供给用户。 Command 对象封装了与动作的语义相关的名称和信息。这个对象主要用于为用户提供动作选择。所产生的命令行为定义在与屏幕显示相关联的 CommandListener 中。

每一个 Command 包含三块信息:一个 label(标号)、一个 type(类型)和一个 priority(优先级)。label 用于命令的可视表示;type 和 priority 由系统使用,系统用它们来决定 Command 如何映射到具体用户界面。

图 5 显示了 J2ME 中的事件处理机制。



图 5. 在 J2ME 中处理用户事件

设计用户界面

MIDP API 尽管维护的是一个受限的框架,但它还是提供了 UI 元素的完整集合。以下是最重要的 UI 元素中的一些:

UI 元素的完整列表可在 MID Profile API 文档中找到,该文档随 J2ME Wireless Toolkit 一起提供(请参阅下面的 参考资料获得更多信息)。

管理设备数据库

MIDP 提供了一组用于组织和操作设备数据库的类和接口: RecordStoreRecordComparatorRecordFilterRecordStore 由大量的记录组成,这些记录在 MIDlet 的多个调用之间跨越时保持持久。对 RecordStore 中的记录进行比较,或者从 RecordStore 中抽取若干组记录,都是 RecordComparatorRecordFilter 接口提供的功能。


<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right">回页首</td></tr></table></td></tr></table>

开发 J2ME 应用程序

前面的部分已经对 J2ME 作了一个概览。在这一部分中,我们将通过开发一个现实的电话界面应用程序来熟悉这个平台的实践细节。

一个样本应用程序:电话日历

J2ME 的著名特色之一是它在受限环境中的日期处理功能。J2ME 提供的 DateField UI 元素是一个可编辑的组件,该组件用于表示日历信息(即日期和时间)。在这一部分中,我们将使用 DateFieldDate 函数来开发一个 J2ME 应用程序,这个应用程序用于在移动电话 UI 上显示一个滚动日历。



一个电话日历应用程序
<table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td class="code-outline">
// Import of API classes
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;
//A first MIDlet with simple text and a few commands.
public class PhoneCalendar extends MIDlet
 implements CommandListener, ItemStateListener {
//The commands
private Command exitCommand;
//The display for this MIDlet
private Display display;
// Display items e.g Form and DateField
Form displayForm;
DateField date;
public PhoneCalendar() {
  display = Display.getDisplay(this);
exitCommand = new Command("Exit", Command.SCREEN, 1);
  date = new DateField("Select to date", DateField.DATE);
}
// Start the MIDlet by creating the Form and 
// associating the exit command and listener.
public void startApp() {
displayForm = new Form("Quick Calendar");
  displayForm.append(date);
  displayForm.addCommand(exitCommand);
displayForm.setCommandListener(this);
displayForm.setItemStateListener(this);
display.setCurrent(displayForm);
}
public  void itemStateChanged(Item item)
{
 // Get the values from changed item
}
// Pause is a no-op when there is no  background
// activities or record stores to be closed.
public void pauseApp() { }
// Destroy must cleanup everything not handled 
// by the garbage collector.
public void destroyApp (boolean unconditional) { }
// Respond to commands. Here we are only implementing
// the exit command. In the exit command, cleanup and
// notify that the MIDlet has been destroyed.
public void commandAction (
Command c, Displayable s) {
if (c == exitCommand) {
destroyApp(false);
  notifyDestroyed();
}
}
}
</td></tr></table>

如上定义的 PhoneCalendar MIDlet 继承了 ItemListenerCommandListener 。它使 MIDlet 具备了跟踪屏幕上的条目变化和对用户命令作出响应的功能。由此应用程序创建的用户界面从为电话屏幕定义一个显示并附加上一个 Form 开始。该 Form 充当容器使用,可以保持一些用户界面项。 commandAction() 函数在 J2ME 中执行命令处理程序,并且定义某个命令应执行的动作。


<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right">回页首</td></tr></table></td></tr></table>

部署 J2ME

您可以从 Sun 下载一个仿真器,该仿真器允许您在台式机系统上测试 J2ME 应用程序。如果您宁愿避免所有的图形开销,则您也可以在命令行上部署 J2ME。

在仿真环境中进行部署

在仿真环境中部署和运行 J2ME 应用程序,要涉及到仿真器的安装和配置。J2ME Wireless Toolkit 提供了一个仿真环境,该环境用于在资源受限的设备上对 Java 应用程序进行的开发和部署。这里教您如何自己运行它:

  1. 安装 J2ME Wireless Toolkit(请参阅 参考资料)。安装程序中将会用必要的说明指导您进行安装。为运行这些示例,请选择独立(standalone)模式。如果您想将它集成到 IDE,请选择集成(integrated)模式。
  2. 通过 KToolbar 的用户界面创建一个新工程。指定一个类名。
  3. 将第 2 步指定的类名放到 C:\[J2ME Installation directory]\apps\[Project Name]\src 目录。
  4. 编译这个工程。
  5. 从 J2ME Wireless Toolkit -> Default Device Selection 选择 DefaultGrayPhone 作为缺省设备。
  6. 运行这个工程。

该工具箱还提供有一个选项,用于把工程打包成一个 jar 文件和一个 jad 文件。双击 jad 文件将会部署 jar 文件所指定的应用程序。

在命令行上进行部署

这里也有一些可用的命令行选项。

1. 创建类文件:

<table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td class="code-outline">
C:\J2ME\apps\PhoneCalendar>
 javac _ tmpclasses _ootclasspath 
C:\J2ME\lib\midpapi.zip -classpath tmpclasses;
classes src\*.java
</td></tr></table>

2. 创建清单文件 manifest.mf

<table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td class="code-outline">
MIDlet-1: PhoneCalendar,
PhoneCalendar.png,
PhoneCalendar
MIDlet-Name: Phone Calendar
MIDlet-Vendor: Sun Microsystems
MIDlet-Version: 1.0
MicroEdition-Configuration: CLDC-1.0
MicroEdition-Profile: MIDP-1.0
</td></tr></table>

3. 创建 jar 文件:

<table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td class="code-outline">
C:\J2ME\apps\PhoneCalendar>jar cfm .\bin\
PhoneCalendar.jar 
manifest.mf  -C classes . _ res .
</td></tr></table>

4. 创建 jad 文件:

<table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td class="code-outline">
MIDlet-1: PhoneCalendar, 
PhoneCalendar.png, 
PhoneCalendar
MIDlet-Jar-Size: 4490
MIDlet-Jar-URL:
F:\J2ME\apps\PhoneCalendar\bin\
PhoneCalendar.jar
MIDlet-Name: PhoneCalendar
MIDlet-Vendor: Sun Microsystems
MIDlet-Version: 1.0
</td></tr></table>

5. 运行 jad 文件:

<table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td class="code-outline">
C:\J2ME\bin> emulator -Xdescriptor:
C:\J2ME\apps\PhoneCalendar
\bin\PhoneCalendar.jad
</td></tr></table>

<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right">回页首</td></tr></table></td></tr></table>

结束语

J2ME 是一个重要的用于无线方面的 Java 平台,它从可移植的、以网络为中心的 Java 虚拟机转变而来。J2ME 应用程序的开发和部署的灵活性将有效地满足日益增长的无线领域的需求。
↑返回目录
前一篇: 高分寻找,用JBUILDER做J2ME的朋友
后一篇: 想做一个诺基亚手机上的恶意短信屏蔽程序,该从哪入手啊,请各位来帮帮忙,我是J2ME的新手