j2me概要(摘录)

Posted on 2005-08-30 14:29 ShQ 阅读(372) 评论(0)  编辑  收藏



J2ME
为小型设备带来了 Java 语言的跨平台功能,允许移动无线设备共享应用程序.

J2ME
使用配置和简表定制 Java 运行时环境 (JRE)。作为一个完整的 JREJ2ME 由配置和简表组成,配置决定了使用的 JVM,而简表通过添加特定于域的类来定义应用程序。 
配置将基本运行时环境定义为一组核心类和一个运行在特定类型设备上的特定 JVM.

简表定义应用程序;特别地,它向 J2ME 配置中添加特定于域的类,定义设备的某种作用。

配置概述
配置将基本运行时环境定义为一组核心类和一个运行在特定类型设备上的特定 JVM。虽然还可能在将来定义其他的配置,但当前 J2ME 存在两种配置: 
·
连接限制设备配置 (CLDC) 特别与 KVM 一起用于内存有限的 16 位或 32 位设备。这是用于开发小型 J2ME 应用程序的配置(虚拟机)。(从开发的角度来看)它的大小限制让它比 CDC 更有趣、更具挑战性。CLDC 同时还是用于开发绘图工具应用程序的配置。 Palm 电脑便是一个运行小应用程序的小型无线设备的示例。我们将在 J2ME 配置一章中深入介绍 CLDC
·
连接设备配置 (CDC) C 虚拟机 (CVM) 一起使用,用于要求内存超过 2 兆的 32 位体系结构。互联网电视机顶盒便是这类设备的一个示例。虽然稍后我们将在 CDC API 一章中简要介绍 CDC,但它并不在本教程的范围内。

chapter2

设计开发小型设备应用程序要注意的事项
·
保持程序简单。 

·
程序越小越好。这一点对所有的开发者来说应该是显而易见的。越小的程序占用的设备内存越少,并且花费的安装时间越少。可考虑将您的 Java 应用程序打包,作为压缩的 Java 档案 (jar) 文件。

·
运行时占用最少的内存。为尽可能减少运行时占用的内存,使用标量类型代替对象类型。同时,不依赖垃圾收集程序。您应该在使用完对象时将对象引用置空,这样可有效管理内存。另外一种减少运行时所需内存的方法是使用惰性实例,它仅在必需时才分配对象。其它一些减少小型设备上过量和峰值内存使用的方法有快速释放资源、重新使用对象以及避免异常。
 

·  设计开发移动设备应用程序的注意事项
开发移动设备应用程序的规则与我们前面提及的开发小型设备的相同:先设计再编码。让我们检查一下开发移动设备应用程序时可考虑的一些设计建议: 
·
让服务器做大部分的工作。将计算性较强的任务放到服务器上,让服务器为您做这些工作。让移动设备处理界面和最少的计算工作,而让服务器做繁重的工作。当然,您为其开发应用程序的移动设备对设备连接到服务器上的难易程度和频率有重要影响。 

·
谨慎地选择编程语言。J2ME 仍然处于成长期,可能还不是最好的选择。根据您的需要,选择其它的面向对象语言,如 C++,可能会更好。

  • 性能注意事项
    为性能而编码。下面有一些以获得最优性能为目标的编码方法:
    ·
    使用局部变量。访问局部变量比访问类成员更快。
    ·
    避免字符串串联。字符串串联不仅会降低性能,而且会增加应用程序的内存峰值占用量。

    ·
    使用线程,避免同步。任何运行时间超过 1/10 秒的操作都需要一个独立的线程。避免同步同样能提高性能。

    ·
    使用模型视图控制器 (MVC) 分离模型。MVC 将代码中控制显示的逻辑分离出来。

 

  • 编译注意事项
    同其它的 Java 应用程序一样,您在打包和部署应用程序之前要先进行编译。尽管有了 J2ME,您仍然使用 J2SE 编译器并且需要用适当的选项来进行调用。
    特别的,您需要使用 -bootclasspath 选项来指示编译器使用 J2ME 类,而不是 J2SE 类。不要在编译器的 CLASSPATH 中设置配置类。这样将导致运行时错误,因为不管 CLASSPATH 中有什么,编译器将首先自动搜索 J2SE 的核心类。换句话说,编译器将无法引用特定 J2ME 配置中缺少的类或方法,结果导致在尝试运行应用程序时出现运行时错误。

第三章:J2ME配置

·  连接限制设备配置 (CLDC)
CLDC
是由 Java Community Process 创建的。正如 Sun Microsystems Web 站点所定义的那样,它的标准是:轻便、覆盖区域最小的 Java 构建块,适合小型的、有资源限制的设备。” 
J2ME CLDC
配置是为将在业界定义的简表中使用的一个虚拟机和一套核心库准备的。正如第 2 章中提及的,一个简表通过在基本 J2ME 配置顶部提供特定于域的类来为特定的设备定义应用程序。K 虚拟机 (KVM)、虚拟机的 CLDC 的参考执行和它的 KJava 简表运行在 CLDC 的顶部。 
CLDC
简要描述了高度限制设备上每个 J2ME 执行所要求的一套最基本的库和 Java 虚拟机特征。CLDC 主要面向那些网络连接速度慢、能源有限(经常是电池供电)、具有大于等于 128 KB 的稳定内存、以及大于等于 32 KB 的不稳定内存的设备。不稳定内存是不持久的并且没有写保护,这意味着如果关掉设备,内存中的内容将全部丢失。而稳定内存中的内容是持久的,并且有写保护。CLDC 设备使用稳定内存来存储运行时的库和 KVM,或存储为某个特殊设备创建的另一个虚拟机。不稳定内存被用来分配运行时的内存。

 针对 CLDC 的类都在名为 javax.microedition 的软件包和它的子包里
javax.microedition 软件包以外,CLDC API 还由 J2SE 的子集 java.iojava.lang 以及 java.util 等软件包组成。

连接设备配置 (CDC)
连接设备结构 (CDC) 被定义为一种添加了 CLDC 类的 Java 2 标准版 (J2SE) 的简化版。因此,CDC 是建立在 CLDC 的基础之上,并且为 CLDC 设备开发的应用程序也可以运行在 CDC 设备上。
CDC
也是由 Java Community Process 开发的,它为用户的电子设备和嵌入式设备如智能电话、双向寻呼机、PDA、家用电器、销售网络终端以及汽车导航系统等提供一种标准化的、轻便的、功能齐全的 Java 2 虚拟机构建块。这些设备运行 32 位的微处理器和超过 2 MB 的内存,这些对于存储 C 虚拟机和库是必需的。K 虚拟机支持 CLDC,而 C 虚拟机 (CVM) 支持 CDC


CLDC
CDC 的比较
面这幅图描述了 CDC CLDC 之间的关系。同时该图也揭示了它们与整个 J2SE API 系。正如前面所说,CDC 是加上一些额外类的 J2SE 的子集。我们也可以看到 CLDC CDC 的子集。 

第四章:J2ME简表

J2ME 简表是什么?
如我们在前面教程中提及的,一个简表定义了受支持设备的类型。例如,移动信息设备简表 (MIDP),定义了蜂窝电话的类。它把一些特定于域的类加入J2ME 配置中来定义对类似设备的使用。已经为 J2ME 定义了两个简表:KJava MIDP 。它们都构建在 CLDC 之上。KJava MIDP 都和 CLDC 及小型设备相关联。
CDCCLDC已经对设备进行了区分,KJAVAMIDP是进一步得区分) 



MIDP 取代 KJava
正如我们在前面的章节中提及的,KJava Sun 公司所拥有的一个 API。它不作为一种完整的、功能齐全的简表,而是作为一种示范,示范简表如何与 CLDC 一起工作。根据 CLDC 发行说明 (其中包含 CLDC 下载版本):
在软件包 com.sun.kjava 中提供的 GUI 类不是连接限制设备配置 CLDC 的一部分。Java 2 平台袖珍版的正式 GUI 类,将通过 Java Community Process 分别定义并被包含进 J2ME 简表中。
不管这个事实存在与否,KJava 简表已经被早期的采用者广泛使用了。在 2001 JavaOne 的开发商会议上,Sun 公司宣称早期 Palm 操作系统的 MIDP 可用性(MID 简表的最初发行版焦点主要集中在无线电话上)。 Palm 操作系统 MIDP 的规格是由 Java Community Process (JCP) 定义的。因此,它是独立于供应商的。当前众多限制中的一个 -- 它将随时间消失 -- 就是 Palm 操作系统的 MIDP 需要最新的 Palm 操作系统,3.5 版。
在我们写这个教程的同时, Palm 操作系统的 MIDP 的规范仍然在随着 JCP 不断发展,其细节也会随时改变。尽管目前还无法确定其发行日期,但是规范一旦出台,将必然减少对 KJava 的需求。

第九章:MIDP API

  • UI 设计注意事项
    MIDP
    包括一个低级的 UI API 和一个高级的 UI API。低级的 API 允许您完全访问一个设备的显示屏,也允许访问原始键和指针事件。然而,使用低级 API 时, 没有可用的用户界面控件。应用程序必须精确地绘制出按钮和其它所有的控件。 
    相反,高级 API 提供简单的用户界面控件但不能直接访问原始的输入事件或显示屏。由于显示屏的尺寸和 MIDP 设备输入方法的差异,控件显得很抽象。MIDP 的实现确定了绘制控件的方法,也确定了如何管理用户输入。
     
    让我们在后面的章节里更进一步了解 MIDP 的软件包和类。

 

  • MIDP API
    MIDP
    包含四个核心 CLDC 软件包 (java.langjava.iojava.util javax.microedition.io),另加下面的三个特定于 MIDP 的软件包: 
    · javax.microedition.lcdui 
    · javax.microedition.midlet 
    · javax.microedition.rms
    我们将在本章的后面部分详细介绍特定于 MIDP 软件包。除了上面新的软件包之外,MIDP 还向核心 CLDC 软件包添加了四个新类,如下所示。
     
    · java.util.Timer --
    用于为后台线程中将来要执行的任务确定时间。


    · java.util.TimerTask --
    java.util.Timer 类使用,用来为后台线程中稍后的执行定义任务。

    · javax.microedition.io.HttpConnection --
    一个接口,为 HTTP 连接定义必要的方法和常量。

    · java.lang.IllegalStateException --
    一个 RuntimeException 指出在不合法或不合适的时间已经调用的一个方法。

 

  • MIDlet 介绍
    MIDlet
    是一个 Java 类,它扩展了 javax.microedition.midlet.MIDlet 抽象类。实现 startApp()pauseApp() destroyApp()方法,这些方法类似于 J2SE java.applet.Applet 类中的 start()stop() destroy()方法。 
    除了扩充 javax.microedition.midlet.MIDlet 的主 MIDlet 类之外,一个 MIDP 应用程序通常还包括其它一些类,这些类能随它们的资源一起被打包成为 jar 文件 -- 称之为 MIDlet 套件。一个 MIDlet 套件中的不同 MIDlet 能共享 jar 文件的资源,尽管不同套件中的 MIDlets 不能直接相互作用。
     
    MIDlet
    在应用程序生命周期中有三种可能的存在状态 -- 运行状态、暂停状态、销毁状态。运行状态,正如其名称所暗示的,意味着 MIDlet 正在运行中。这种状态始于 startApp 方法被调用时。在暂停状态中,MIDlet 持有的所有资源将被释放,但是它准备着再次被运行。调用 notifyPaused 方法时,MIDlet 处于暂停状态。在销毁状态中,MIDlet 已经永久地将其自身关闭,释放所有的资源,等待着废物清理程序的处理。它是通过 notifyDestroyed 方法来调用的。 
  • 在接下来的两页中,我们来看一个简单的 HelloWorld MIDlet

 

  • HelloWorld MIDlet
    与使用 KJava HelloWorld 应用程序一样,这个 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();
    }
  • MIDP 软件包
    除标准 CLDC 软件包之外,MIDP 还包含三个附加的软件包: 
    · javax.microedition.lcdui --
    定义用来控制 UI 的类。这个软件包既包含高级 UI 类(例如 FormCommandDateField TextField 等),又包含低级 UI 类(允许用低级方式控制 UI)。


    · javax.microedition.midlet --
    包含 MIDP 主类中的一个,MIDlet 类,为 MIDP 应用程序提供访问关于其运行所在环境信息的权限。

    javax.microedition.rms --
    定义一个类的集合,这些类为 MIDlet 提供了永久存储并随后重新得到数据的机制。

 


只有注册用户登录后才能发表评论。


网站导航:
 

posts - 9, comments - 1, trackbacks - 0, articles - 0

Copyright © ShQ