仔细研究J2ME

779 篇文章 0 订阅
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

  内容:

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

  J2ME体系结构和配置

  用MIDPAPI进行J2ME编程:构件

  开发J2ME应用程序

  部署J2ME

  结束语

  参考资料

  关于作者

  对本文的评价

  相关内容:

  关联对等网(RelatingPeertoPeer)

  更多的dWWireless参考资料

  在Java专区中还有:

  教程

  工具和产品

  代码和组件

  文章

  Java平台提供了用于小型网络设备的平台

  SomaGhosh(sghosh@entigo.com)

  高级应用程序开发员,Entigo

  2001年11月

  Java2平台袖珍版(Java2Platform,MicroEdition(J2ME))为开发者提供了伟大的工具,它把Java平台的以网络为中心和平台不可知论的特性移植到有限存储器和有限处理器的设备。SomaGhosh解释了J2ME领域的基础知识,向您展示了该平台的构件并演示了一个样本应用程序。

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

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

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

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

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

  VM的大小和类库已减小为50到80KB目标代码的标准

  存储器占用已经减小为几十千字节的标准

  在具有16位和32位处理器的设备上,性能有效

  体系结构是高可移植的,特定于机器和/或平台的代码的总量很少

  多线程和垃圾回收是独立于系统的

  可以对虚拟机的组件进行配置,以适合于特定设备,从而增强了灵活性

  J2ME体系结构和配置

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

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

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

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

  图2显示了J2ME体系结构。

  图2.J2ME体系结构

  Java虚拟机层(JavaVirtualMachineLayer):这一层是Java虚拟机的一个实现,它是为特定设备的主机操作系统定制的,而且支持一个特定的J2ME配置(configuration)。

  配置层(ConfigurationLayer):配置层定义了Java虚拟机功能的和特定类别设备上可用的Java类库的最小集。从某种程度上说,一个配置定义了Java平台功能部件和库的共同性,开发者可以假设这些功能部件和库在属于某一特定类别的所有设备上都是可用的。用户不太会见到这一层,但它对框架(profile)实现者非常重要。

  框架层(ProfileLayer):框架层定义了特定系列设备上可用的应用程序编程接口(API)的最小集。框架在一个特定的配置上面实现。应用程序是针对特定的框架编写的,因此可以移植到支持该框架的任何设备上。一个设备可以支持多个框架。用户和应用程序供应商看到最多的就是这一层。

  MIDP层:移动信息设备框架(MobileInformationDeviceProfile(MIDP))是一个JavaAPI集合,它处理诸如用户界面、持久存储和联网这样的问题。

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

  用MIDPAPI进行J2ME编程:构件

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

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

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

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

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

  用于用户界面的MIDPAPI:设计这些API是为了能以一系列屏幕显示为基础与用户进行交互操作,每一屏幕显示把适量的数据显示给用户。命令以每屏幕为基础提供给用户。这些API允许应用程序决定下一屏显示什么、执行什么计算和使用网络服务的何种请求。

  用于处理数据库的MIDPAPI:这些API负责组织和操作设备数据库,这个数据库由在MIDlet的多个调用之间跨越时保持持久的信息组成。

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

  图3显示了J2ME的构件。

  图3.J2ME的构件

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

  图4.J2ME和J2SEAPI之间的关系

  J2ME中的事件处理

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

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

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

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

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

  设计用户界面

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

  Alert用于在屏幕上向用户显示关于异常情况或错误的信息。

  Choice用于实现从既定数量的选项中进行选择。

  ChoiceGroup提供一组相关选项。

  Form作为其它UI元素的容器。

  List提供一个选项列表。

  StringItem充当只显(display-only)字符串之用。

  TextBox是允许用户输入和编辑文本的屏幕显示。

  TextField允许用户输入和编辑文本。多个TextField可放到一个Form中。

  DateField是一个可编辑的组件,用于表示日期和时间信息。DateField可以放到Form中。

  Ticker用于文本的可滚动显示。

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

  管理设备数据库

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

  开发J2ME应用程序

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

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

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

  一个电话日历应用程序

  //ImportofAPIclasses

  importjavax.microedition.midlet.*;

  importjavax.microedition.lcdui.*;

  importjava.util.*;

  //AfirstMIDletwithsimpletextandafewcommands.

  publicclassPhoneCalendarextendsMIDlet

  impleMEntsCommandListener,ItemStateListener{

  //Thecommands

  privateCommandexitCommand;

  //ThedisplayforthisMIDlet

  privateDisplaydisplay;

  //Displayitemse.gFormandDateField

  FormdisplayForm;

  DateFielddate;

  publicPhoneCalendar(){

  display=Display.getDisplay(this);

  exitCommand=newCommand("Exit",Command.SCREEN,1);

  date=newDateField("Selecttodate",DateField.DATE);

  }

  //StarttheMIDletbycreatingtheFormand

  //associatingtheexitcommandandlistener.

  publicvoidstartApp(){

  displayForm=newForm("QuickCalendar");

  displayForm.append(date);

  displayForm.addCommand(exitCommand);

  displayForm.setCommandListener(this);

  displayForm.setItemStateListener(this);

  display.setCurrent(displayForm);

  }

  publicvoiditemStateChanged(Itemitem)

  {

  //Getthevaluesfromchangeditem

  }

  //Pauseisano-opwhenthereisnobackground

  //activitiesorrecordstorestobeclosed.

  publicvoidpauseApp(){}

  //Destroymustcleanupeverythingnothandled

  //bythegarbagecollector.

  publicvoiddestroyApp(booleanunconditional){}

  //Respondtocommands.HereweareonlyimpleMEnting

  //theexitcommand.Intheexitcommand,cleanupand

  //notifythattheMIDlethasbeendestroyed.

  publicvoidcommandAction(

  Commandc,Displayables){

  if(c==exitCommand){

  destroyApp(false);

  notifyDestroyed();

  }

  }

  }

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

  部署J2ME

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

  在仿真环境中进行部署

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

  安装J2MEWirelessToolkit(请参阅参考资料)。安装程序中将会用必要的说明指导您进行安装。为运行这些示例,请选择独立(standalone)模式。如果您想将它集成到IDE,请选择集成(integrated)模式。

  通过KToolbar的用户界面创建一个新工程。指定一个类名。

  将第2步指定的类名放到C:/[J2MEInstallationdirectory]/apps/[ProjectNaME]/src目录。

  编译这个工程。

  从J2MEWirelessToolkit->DefaultDeviceSelection选择DefaultGrayPhone作为缺省设备。

  运行这个工程。

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

  在命令行上进行部署

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

  1.创建类文件:

  C:/J2ME/apps/PhoneCalendar>

  javac_tmpclasses_ootclasspath

  C:/J2ME/lib/midpapi.zip-classpathtmpclasses;

  classessrc/*.java

  2.创建清单文件manifest.mf:

  MIDlet-1:PhoneCalendar,

  PhoneCalendar.png,

  PhoneCalendar

  MIDlet-NaME:PhoneCalendar

  MIDlet-Vendor:SunMicrosystems

  MIDlet-Version:1.0

  MicroEdition-Configuration:CLDC-1.0

  MicroEdition-Profile:MIDP-1.0

  3.创建jar文件:

  C:/J2ME/apps/PhoneCalendar>jarcfm./bin/

  PhoneCalendar.jar

  manifest.mf-Cclasses._res.

  4.创建jad文件:

  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:SunMicrosystems

  MIDlet-Version:1.0

  5.运行jad文件:

  C:/J2ME/bin>emulator-Xdescriptor:

  C:/J2ME/apps/PhoneCalendar

  /bin/PhoneCalendar.jad

  结束语

  J2ME是一个重要的用于无线方面的Java平台,它从可移植的、以网络为中心的Java虚拟机转变而来。J2ME应用程序的开发和部署的灵活性将有效地满足日益增长的无线领域的需求。敬请继续关注!

  参考资料

  参加本文的讨论论坛。

  访问developerWorksWireless专区,保持对无线(wireless)领域的关注。

  developerWorksJava技术专区让您紧跟Java领域发生的事件。

  这篇文章讨论关联对等网(relatingpeer-to-peer)以及将所有无线用品融合起来的机制。

  到IBM的PervasiveComputing站点查阅最新进行的开发。

  用IBM的VisualAgeforJava编译Java应用程序。

  Sun提供的一些文档:

  访问J2ME的主页,以了解J2ME到底是什么。

  阅读J2ME体系结构和配置的详细信息(PDF格式)。

  参阅关于J2ME的更多文档。

  阅读J2ME平台的ConnectedLimitedDeviceConfiguration和ConnectedDeviceConfiguration。

  访问MIDP主页,以了解MIDPAPI。

  下载J2MEWirelessToolkit,以运行和测试您的J2ME应用程序。您也可以浏览这个工具箱(toolkit)随带的MIDPAPI文档。

  浏览关于“Java无线倡议”的广泛文章。

  关于作者

  SomaGhosh是计算机科学与工程学士。在过去六年中,她已经开发了涉及范围颇广的电子商务和网络Java应用程序。她相信无线商务是业界近年的前途所在,最近她已从现有的台式机模型中转到了无线倡议中。目前,她是Entigo的高级应用程序开发员,也是B2B销售和服务器端电子商务产品和解决方案的倡导者。请通过sghosh@entigo.com与Soma联系。

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值