BlackBerry J2ME编程指南


BlackBerry J2ME 编程指南 作者: 王志刚 目录 第一篇 J2ME 编程基本指南 ........................................................................................................................ 5 1 引言............................................................................................................................................................ 5 2 J2ME 概述 .................................................................................................................................................. 6 2.1 介绍..................................................................................................................................................... 6 2.2 J2ME 是什么? ................................................................................................................................... 6 2.3 J2ME 总体架构 ................................................................................................................................... 6 2.4 配置概述 ............................................................................................................................................. 7 2.5 简表概述 ............................................................................................................................................ 7 2.6 J2ME 目标设备 ................................................................................................................................... 7 2.7 J2ME、J2SE 与 J2EE 之间的比较 ....................................................................................................... 8 3 开发 J2ME 应用程序 ................................................................................................................................. 8 3.1 介绍 .................................................................................................................................................... 8 3.2 设计开发小型设备应用程序要注意的事项 ..................................................................................... 9 3.3 设计开发移动设备应用程序的注意事项 ....................................................................................... 9 3.4 性能注意事项 ..................................................................................................................................... 9 3.5 编译注意事项 ..................................................................................................................................... 9 3.6 打包和部署注意事项 ....................................................................................................................... 10 4 J2ME 配置 ................................................................................................................................................ 10 4.1 J2ME 配置是什么? ......................................................................................................................... 10 4.2 连接限制设备配置 (CLDC) ............................................................................................................... 11 4.3 CLDC 要求 ......................................................................................................................................... 11 4.4 连接设备配置 (CDC) ......................................................................................................................... 11 5 J2ME 简表 ................................................................................................................................................ 12 5.1 J2ME 简表是什么? ........................................................................................................................... 12 5.2 简表 : MIDP ....................................................................................................................................... 13 6. J2ME 开发环境 ....................................................................................................................................... 13 第二篇 J2ME 和 J2SE 的差异 ..................................................................................................................... 14 1. 总体 API 差异 ...................................................................................................................................... 15 1.1 CLDC API ........................................................................................................................................... 15 1.1.2 java.lang ..................................................................................................................................... 15 1.1.3 java.lang 核心运行时类 ............................................................................................................ 16 1.1.4 java.lang 核心数据类型类 ........................................................................................................ 16 1.1.5 java.lang 帮助类 ........................................................................................................................ 16 1.1.6 java.io 输入类 ............................................................................................................................ 16 1.1.7 java.io 输出类 ............................................................................................................................ 16 1.1.8 java.util 收集类 .......................................................................................................................... 17 1.1.9 java.util -- 其它的类 .................................................................................................................. 17 1.1.10 javax.microedition.io ............................................................................................................... 17 1.1.11 javax.microedition.io 帮助接口 ............................................................................................... 17 2. MIDP API ................................................................................................................................................. 18 2.1 介绍................................................................................................................................................... 18 2.2 UI 设计注意事项 .............................................................................................................................. 18 2.2 MIDP API ........................................................................................................................................... 18 2.3 MIDlet 介绍....................................................................................................................................... 18 2.4 HelloWorld MIDlet ............................................................................................................................ 19 2.5 MIDP 软件包 ..................................................................................................................................... 20 2 具体 API 集差异 ................................................................................................................................... 21 2.1 In/Out ................................................................................................................................................ 21 2.2 String 操作 ........................................................................................................................................ 22 2.4 File I/O ............................................................................................................................................... 25 2.5 GUI .................................................................................................................................................... 25 2.7 Applet ................................................................................................................................................ 27 2.8 Network ............................................................................................................................................ 27 2.9 Database ........................................................................................................................................... 29 第三篇 blackberry 上的 J2ME 编程 ........................................................................................................ 30 1 开发包支持 .......................................................................................................................................... 30 2 UI 开发支持 .......................................................................................................................................... 30 3 blackberry native API 的混用 ............................................................................................................... 31 3.1 关于 blackberry 应用和 midlet 应用的集成 ................................................................................... 31 3.1.1 用 RMS 在 MIDlet 和 BlackBerry 之间共享数据 ...................................................................... 31 3.1.2 使用全局事件来进行应用交互 ............................................................................................... 31 3.1.3 使用 RUNTIME Store 来应用交互 ............................................................................................ 31 3.2 Midlet 和 blackberry 应用互操作 .................................................................................................... 31 3.3 对 GPS 的补充 .................................................................................................................................. 32 4 日志支持 .............................................................................................................................................. 33 第一篇 J2ME 编程基本指南 1 引言 根据mobile vision的最新报告,目前在移动开发市场,2008年之前一直占据开发者关注度主要地位的Java ME已经慢慢被新兴开发技术所领先。但是依然占据前三的位置。作为blackberry开发策略和平台的一个重 要补充,J2ME的开发在blackberry设备的应用中,也占据着极为重要的位置。 这篇文章,主要从J2ME的编程的具体角度来评估和衡量J2ME开发的具体方法,通过与标准J2SE的比较,结 合BlackBerry开发平台上的J2ME编程的特点,为广大BlackBerry开发者提供一个指南。 本文的主要内容分为三个部分: 第一部分是关于J2ME的概览,包括J2ME的框架和API的构成结构 第二部分是J2ME的差异,主要从编程的角度来讨论和识别J2ME编程和标准J2SE的区别不同 第三部分是BlackBerry的J2ME编程环境介绍,这部分主要介绍BlackBerry环境下的J2ME编程指南,包括开 发环境,编码测试帮助以及一些开发上的功能增强。 关于J2ME编程的详细指南和入门,可以参考oracle的官方网站: http://www.oracle.com/technetwork/java/javame/overview/index.html 2 J2ME 概述 2.1 介绍 这一章将开始教您使用 J2ME。我们将从定义 J2ME 开始,然后讨论它的总体架构并学习 J2ME 目标 设备。作为架构讨论的一部分,我们将提供有关简表和配置的概述(后面的章节中将详细介绍简表和配 置)。 2.2 J2ME 是什么? Sun Microsystems 将 J2ME 定义为“一种以广泛的消费性产品为目标的的高度优化的 Java 运行时环 境,包括寻呼机、移动电话、可视电话、数字机顶盒和汽车导航系统。” 自从 1999 年JavaOne Developer Conference 上声明之后,J2ME 为小型设备带来了 Java 语言的跨平 台功能,允许移动无线设备共享应用程序。有了 J2ME,Sun 已经使 Java 平台能够适应集成了或基于小型 计算设备的用户产品。 2.3 J2ME 总体架构 J2ME 使用配置和简表定制 Java 运行时环境 (JRE) 。作为一个完整的 JRE,J2ME 由配置和简表组 成,配置决定了使用的 JVM,而简表通过添加特定于域的类来定义应用程序。 配置将基本运行时环境定义为一组核心类和一个运行在特定类型设备上的特定 JVM。我们将在 J2ME 配 置一章中详细讨论配置。 简表定义应用程序;特别地,它向 J2ME 配置中添加特定于域的类,定义设备的某种作用。我们将在 J2ME 简表一章中深入介绍简表。 下面的图表描述了不同的虚拟机、配置和简表之间的关系。它同时把 J2SE API 和它的 Java 虚拟机进 行了比较。虽然 J2SE 虚拟机通常被称为一种 JVM,但是 J2ME 虚拟机、KVM 和 CVM 都是 JVM 的子集。 KVM 和 CVM 均可被看作是一种 Java 虚拟机 -- 它们是 J2SE JVM 的压缩版,并特定于 J2ME。 2.4 配置概述 配置将基本运行时环境定义为一组核心类和一个运行在特定类型设备上的特定 JVM。虽然还可能在将 来定义其他的配置,但当前 J2ME 存在两种配置: · 连接限制设备配置 (CLDC) 特别与 KVM 一起用于内存有限的 16 位或 32 位设备。这是用于开发小 型 J2ME 应用程序的配置(虚拟机)。(从开发的角度来看)它的大小限制让它比 CDC 更有趣、更具挑战 性。CLDC 同时还是用于开发绘图工具应用程序的配置。 Palm 电脑便是一个运行小应用程序的小型无线设 备的示例。我们将在 J2ME 配置一章中深入介绍 CLDC。 · 连接设备配置 (CDC) 与 C 虚拟机 (CVM) 一起使用,用于要求内存超过 2 兆的 32 位体系结构。互 联网电视机顶盒便是这类设备的一个示例。虽然稍后我们将在 CDC API 一章中简要介绍 CDC,但它并不在 本教程的范围内。 2.5 简表概述 简表定义了您的应用程序所支持的设备类型。特别地,它向 J2ME 配置添加了特定于域的类来定义设 备的某种作用。简表建立在配置的顶部。已经为 J2ME 定义了两种简表:KJava 和移动信息设备简表 (MIDP),它们也被建立在 CDLC 上。这两种简表适用于小型设备。 有一种纲要简表,您可以在它的上面创建自己的简表,这种纲要简表也称为基础表,可供 CDC 使用。 然而,在本教程中,我们只重点介绍建立在 CLDC 顶部,适用于小型设备的简表。 我们将在后面的章节中讨论上述这些简表,还会使用 MIDP 建立一些示例应用程序。 2.6 J2ME 目标设备 使用 CLDC 开发的 J2ME 应用程序的目标设备通常具有以下特征: · 可供 Java 平台使用的 160 到 512 千字节的总内存 · 功率有限,常常是电池供电 · 网络连通性,常常是无线的、不一致的连接并且带宽有限 · 用户接口混乱,程度参差不齐;有时根本就没有接口 一些 CLDC 支持的设备,包括无线电话、寻呼机、主流个人数字助手 (PDA),以及小型零售支付终端。 依照 Sun Microsystems,CDC 的目标设备通常具有以下特征: · 使用 32 位处理器 · 2 兆字节或更多可供 Java 平台使用的总内存 · 设备要求的 Java 2 “蓝皮书”虚拟机的全部功能 · 网络连通性,常常是无线的、不一致的连接并且带宽有限 · 用户接口混乱,程度参差不齐;有时根本就没有接口 一些 CDC 支持的设备,包括常驻网关、智能电话和通讯器、PDA、管理器、家用电器、销售网点终端以 及汽车导航系统。 2.7 J2ME、J2SE 与 J2EE 之间的比较 下面的图表描述了支持 J2ME 应用程序的设备,同时说明了 J2ME 适合 Java 平台之处: 3 开发 J2ME 应用程序 3.1 介绍 在这一章中,我们将复习一下在为小型设备开发应用程序时需要牢记的一些注意事项。我们将看一下 在使用 J2SE 编译 J2ME 应用程序时调用编译器的方法。最后我们将探究打包和部署,以及在这个过程中 提前验证所扮演的角色。 3.2 设计开发小型设备应用程序要注意的事项 为小型设备开发应用程序,需要您在设计阶段制定某种策略。最好是在开始编写代码之前,战略性地为 小型设备设计应用程序。由于无法考虑到所有的 "Gotchas" ,在开发应用程序之前更正代码是一件很痛苦 的工作。 下面是一些可以考虑的设计策略: · 保持程序简单。除去不必要的功能,如果可能的话,将它们做成独立的、次要的应用程序。 · 程序越小越好。这一点对所有的开发者来说应该是显而易见的。越小的程序占用的设备内存越少,并 且花费的安装时间越少。可考虑将您的 Java 应用程序打包,作为压缩的 Java 档案 (jar) 文件。 · 运行时占用最少的内存。为尽可能减少运行时占用的内存,使用标量类型代替对象类型。同时,不依 赖垃圾收集程序。您应该在使用完对象时将对象引用置空,这样可有效管理内存。另外一种减少运行时所 需内存的方法是使用“惰性”实例,它仅在必需时才分配对象。其它一些减少小型设备上过量和峰值内存使 用的方法有快速释放资源、重新使用对象以及避免异常。 3.3 设计开发移动设备应用程序的注意事项 开发移动设备应用程序的规则与我们前面提及的开发小型设备的相同:先设计再编码。让我们检查一下 开发移动设备应用程序时可考虑的一些设计建议: · 让服务器做大部分的工作。将计算性较强的任务放到服务器上,让服务器为您做这些工作。让移动设 备处理界面和最少的计算工作,而让服务器做繁重的工作。当然,您为其开发应用程序的移动设备对设备 连接到服务器上的难易程度和频率有重要影响。 · 谨慎地选择编程语言。J2ME 仍然处于成长期,可能还不是最好的选择。根据您的需要,选择其它的 面向对象语言,如 C++,可能会更好。 3.4 性能注意事项 为性能而编码。下面有一些以获得最优性能为目标的编码方法: · 使用局部变量。访问局部变量比访问类成员更快。 · 避免字符串串联。字符串串联不仅会降低性能,而且会增加应用程序的内存峰值占用量。 · 使用线程,避免同步。任何运行时间超过 1/10 秒的操作都需要一个独立的线程。避免同步同样能提 高性能。 · 使用模型视图控制器 (MVC) 分离模型。MVC 将代码中控制显示的逻辑分离出来。 3.5 编译注意事项 同其它的 Java 应用程序一样,您在打包和部署应用程序之前要先进行编译。尽管有了 J2ME,您仍 然使用 J2SE 编译器并且需要用适当的选项来进行调用。 特别的,您需要使用 -bootclasspath 选项来指示编译器使用 J2ME 类,而不是 J2SE 类。不要在编译 器的 CLASSPATH 中设置配置类。这样将导致运行时错误,因为不管 CLASSPATH 中有什么,编译器将首先 自动搜索 J2SE 的核心类。换句话说,编译器将无法引用特定 J2ME 配置中缺少的类或方法,结果导致在 尝试运行应用程序时出现运行时错误。 3.6 打包和部署注意事项 由于 J2ME 是为内存有限的小型设备设计的。大部分常用的 Java 提前验证已经从虚拟机中除去以形 成一个较小的覆盖区域。结果,在配置之前提前验证 J2ME 应用程序就很有必要。在运行时会附加一个检 查以确保这个类在提前验证之后还没有改变过。 如何严格执行提前验证或者检查类的正确性依靠的是工具包。CLDC 提供一个称为提前验证的命令行实 用程序,它能够进行实际的验证并且可以把一些额外的信息插入到类文件中去。MIDP 使用无线工具包,这 种工具包提供一种 GUI 工具,也可从命令行运行这种工具。 部署工作取决于您要部署的平台。应用程序必须以一种适合 J2ME 设备类型的格式进行打包和配置,就 如简表定义的那样。 4 J2ME 配置 4.1 J2ME 配置是什么? 正如前面所学,配置将基本运行时环境定义为一套核心类和一个运行在特定类型设备上的特定的 JVM。您也可以学到 J2ME 的两种配置类型是 CLDC 和 CDC。 Sun 提供的 J2ME 配置是适合不同层次的市场需求的 -- CLDC 适合小型设备,而 CDC 适合大型设备。 J2ME 环境可以被动态地配置为提供运行应用程序所需要的环境,而不用考虑是否为设备提供了运行该应用 程序所需的所有 Java 技术库。核心平台接收应用程序代码和库。运行在网络上的服务器软件执行配置工 作。 在下面的几页中,您将学到关于 CLDC 和 CDC 的更多知识以及与它们关联的简表。 4.2 连接限制设备配置 (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,或存储为某个特殊设备创建的另一个虚拟机。不稳定内存被用来分配运行时的内存。 4.3 CLDC 要求 CLDC 定义了下列要求: · 完整的 Java 语言支持(除浮点支持、最终定案和错误处理之外) · 完整的 JVM 支持 · CLDC 的安全性 · 有限国际化的支持 · 继承类 -- 所有不针对 CLDC 的类都必须是 J2SE 1.3 类的子类 · 针对 CLDC 的类都在名为 javax.microedition 的软件包和它的子包里 除 javax.microedition 软件包以外,CLDC API 还由 J2SE 的子集 java.io,java.lang 以及 java.util 等软件包组成。我们将在 CLDC API 这一章中学习有关的细节问题,然后使用 CLDC API 来开 发我们的绘图应用程序。 4.4 连接设备配置 (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。CDC 与基础表相关联,这一点不在本教程的范 围之内。 4.5 CLDC 与 CDC 的比较 面这幅图描述了 CDC 和 CLDC 之间的关系。同时该图也揭示了它们与整个 J2SE API 系。正如前面 所说,CDC 是加上一些额外类的 J2SE 的子集。我们也可以看到 CLDC 是 CDC 的子集。 5 J2ME 简表 5.1 J2ME 简表是什么? 如我们在前面教程中提及的,一个简表定义了受支持设备的类型。例如,移动信息设备简表 (MIDP),定义了蜂窝电话的类。它把一些特定于域的类加入 J2ME 配置中来定义对类似设备的使用。已经为 J2ME 定义了两个简表:KJava 和 MIDP 。它们都构建在 CLDC 之上。KJava 和 MIDP 都和 CLDC 及小型设 备相关联。 简表被构建在配置的顶部。由于简表是特定于运行应用程序的设备的大小(内存的数量),所以,某个 简表是与某种特定的配置相关联的。 在纲要简表上,您可以创建自己的简表,这种纲要简表也称为基础表,它对于 CDC 也是可用的。然 而,在本教程和本节中,我们将只重点学习建立在 CLDC 上的 MIDP 简表。 5.2 简表 : MIDP MIDP 适合诸如蜂窝电话和寻呼机等移动设备。MIDP 和 KJava 一样,也是建立在 CLDC 之上的,并 且提供一个标准的运行时环境,允许在终端用户设备上动态地部署新的应用程序和服务。 MIDP 是一个公共的、为移动设备设计的工业标准简表,它不依赖某个特定的商家。对于移动应用程序 开发来说,它是一个完整的、受支持的基础。 MIDP 包含下列软件包,前面 3 个是核心 CLDC 软件包,另加 3 个特定于 MIDP 的软件包。我们将在 后面的教程中讨论每个软件包: · java.lang · java.io · java.util · javax.microedition.io · javax.microedition.lcdui · javax.microedition.midlet · javax.microedition.rms 6. J2ME 开发环境 J2ME 开发的工具很多,这里我们以 Sun 公司发布的 WTK 为例说明 下载和安装 J2ME 无线工具包 (J2ME Wireless Toolkit) J2ME 无线工具包提供一个完整的开发环境来编写和测试 MIDP 应用程序。下载包括工具、文档和仿真 环境,例如,一个与 Forte for Java 集成的模块。 目前,J2ME 无线工具包仅支持 Windows 98 第二版、Windows NT 4.0 和 Windows 2000 是可用的,不 支持 Windows 95。J2ME 无线工具包的 Solaris 和 Linux 版本在本教程编写的同时正处于筹划之中。 在 Windows 环境下安装 J2ME 无线工具包请按如下步骤: 1. 下载 J2ME 无线工具包。 2. 运行 j2me_wireless_toolkit-1_0_1-fcs.exe 安装无线工具包。 当系统提示您提供安装目录时,请确保该安装目录的完全合法的路径中不包含任何空格。这将帮助您在 今后使用工具包时避免可能出现的问题。 第二篇 J2ME 和 J2SE 的差异 在第二篇 J2ME 基本介绍中,通过对 CLDC/MIDP 以及 J2ME 编程的比较,我们实际上已经看到了 J2ME 和标准 Java 编程的一些差异,本章我们会从两个方面来着重阐述 J2ME 和 J2SE 编程的重大差异。 如下是一个标准的 J2SE 的命令行程序的示例,一般来说标准的 J2SE 编程中,需要一个以 main 函数作为入 口的启动点。 如下部分是一个标准的 J2ME 的程序的主题部分,不同于 J2SE,J2ME 的程序的启动以及执行是一个个的单 元构成。在下面关于 J2ME 应用简表的介绍中,我们会重点介绍 MIDLET 的写法和生命周期。 从这两张图来看,标准的 J2ME 的程序开发,和 J2SE 的差异还是很大的。下面,我们就从两个开发领域的 总体和具体分门别类的 API 类别来说明,在这两个领域编程的时候的差异。 1. 总体 API 差异 1.1 CLDC API 1.1.1 介绍 迄今为止,我们知道 CLDC 比较适合 J2ME,并且也已经建立了我们的开发环境。在这一章中,我们将 更深入地探索 CLDC API。CLDC API 实际上只是 J2SE 的一个子集,它包括 java.lang、java.io 和 java.util,另加一个新软件包 -- javax.microedition。我们将逐个来研究这些软件包,并突出显示每一 个包中的重要的类。 尽管每一个类都在 J2SE 中,但是没有必要让每一个类的 CLDC 实现都能实现 J2SE 支持的所有方法。 您可以检查 CLDC API 文档以确认哪些方法是受支持的。 1.1.2 java.lang CLDC java.lang 软件包是 J2SE java.lang 软件包的一个子集。与 J2SE 相比,它最引人注目的可 能便是冗长的浮点操作了,特别是浮点 (Float) 和双精度 (Double) 类。如果使用浮点的话,这些冗余将 涉及到所有其它的类。 相对于 J2SE v1.3 API,CLDC API 中删去了几个其它的类。其中包括 ClassLoader、Compiler、 InheritableThreadLocal、Number、Package、Process、 RuntimePermission、SecurityManager、 StrictMath、ThreadGroup、ThreadLocal 和 Void。 我们描述了可从下面几页表中的 CLDC java.lang 软件包中获取的主要的类。Java 开发人员对所有这 些类的使用都应该是非常熟悉了。 除这些核心类之外,您还将看到 CLDC 支持的 Runnable 接口,正象 Exception 、Error 和其它有关 的类一样。 1.1.3 java.lang 核心运行时类 java.lang 软件包的核心运行时类有: · Class -- 显示正在运行的 Java 应用程序中的类和接口。 · Object -- 与在 J2SE 中相同,Object 是所有 Java 对象的基本类。 · Runtime -- 为 Java 应用程序提供一种与运行时环境(Java 应用程序在其中运行)进行交互的方 法。 · System -- 提供一些静态的帮助方法,就像为 J2SE 提供方法一样。 · Thread -- 定义 Java 程序的一个执行线程。 · Throwable -- Java 语言中所有错误和异常的超级类。 1.1.4 java.lang 核心数据类型类 java.lang 软件包中的核心数据类型类有: · Boolean -- 包装 boolean 原始数据类型。 · Byte —- 包装 byte 原始数据类型。 · Character -- 包装 char 原始数据类型。 · Integer -- 包装 int 原始数据类型。 · Long -- 包装 long 原始数据类型。 · Short -- 包装 short 原始数据类型。 1.1.5 java.lang 帮助类 java.lang 软件包的帮助类有: · Math -- 包含执行基本数学运算的方法。请注意,所有执行浮点值运算的方法都被省略了,仅保留了 关于 integers 和 longs 的方法:abs()、min() 和 max()。 · String -- 在 Java 中代表对象 String,就像在 J2SE 中一样。 · StringBuffer -- 代表一个可以修改的串,就像在 J2SE 中一样。 1.1.6 java.io 输入类 CLDC API 包含许多 J2SE 中共同使用的输入类。特别地,CLDC java.io 软件包中包括下面一些类: · ByteArrayInputStream -- 包含一个内部缓冲器,它代表可能从输入流中读取的字节。 · DataInput -- 一个接口,从二进制输入流提供字节以供读取并把它们转换成原始 Java 数据类型。 DataInputStream 提供该接口的实现。 · DataInputStream -- 允许应用程序以独立于平台的方式从基层输入流中读取原始 Java 数据类型。 · InputStream -- 一个抽象类,它是所有代表字节输入流的类的超级类。 · InputStreamReader -- 读取字节并把它们按照指定的字符编码方法转换成字符。 · Reader -- 一种读取字符流的抽象类。 注意:其中一些类可能不包含 J2SE 姊妹版支持的所有方法,就像在 java.lang 软件包中一样。尤其 是省略了浮点和双精度方法。 1.1.7 java.io 输出类 CLDC API 包含了许多 J2SE 中的共同使用的输出类。特别是,CLDC java.io 软件包中包括下面一些输 出类: · ByteArrayOutputStream -- 实现一个输出流,在此输出流中数据被写入字节数组。 · DataOutput -- 一种接口,提供原始 Java 数据类型以供写入二进制输出流。DataOutputStream 提 供该接口的实现。 · DataOutputStream -- 一个输出流,允许应用程序以一种便捷的方式编写原始 Java 数据类型。 · OutputStream -- 一个抽象类,它是所有代表字节输出流的类的超级类。 · OutputStreamReader -- 给出字符,并按指定的字符编码方法将其转换为字节。 · PrintStream -- 添加一种便捷的方法来打印数据值的文本表现形式。 · Writer -- 编写字符流的一个抽象类。 其中一些类可能不包含 J2SE 支持的所有方法,比如浮点和双精度方法。 1.1.8 java.util 收集类 CLDC java.util 软件包中包含 J2SE java.util 软件包中最常用的类。这些类中包括四个收集类(实际 是三个收集类和一个接口),以及日期/时间和实用程序类。 CLDC 支持的 java.util 收集类有: · Enumeration -- 一个接口,通过项目集允许对例程进行重复调用。 · Hashtable -- 实现 hashtable,将键映射到值。 · Stack -- 代表了一个后进先出 (LIFO) 的对象集合或堆栈。 · Vector -- 代表可以调整大小的对象“数组”或者矢量。 1.1.9 java.util -- 其它的类 CLDC 支持的 java.util 类中其余部分包括日期和时间类,以及 Random 实用程序类。下表中简要列出了 这些类。 · Calendar -- 一个抽象类,使用一套整型字段如 YEAR、MONTH、 DAY 等来获取和设置日期。 · Date -- 代表特定的时间和日期,精确到毫秒级。 · Random -- 一个实用程序类,用来生成 int 或 long 的随机值流。 · TimeZone -- 代表时区的偏移量,也用于校正时间。 1.1.10 javax.microedition.io 迄今为止,我们在 CLDC API 中看到的所有的类都是 J2SE API 的子类。CLDC 还包含一个附加的软件包 - - javax.microedition.io。 在这个包里唯一被定义的类就是 Connector 类,也称为工厂类,包含创建 Connection 对象或输入、 输出流的方法。 当动态识别一个类的名字时,Connection 对象就被创建了。类名称的识别基于平台名称和被请求连接 的协议。描述目标对象的参数串应该满足 RFC 2396 规范所要求的格式。请使用下列格式: {scheme}:[{target}][{params}] {scheme} 是一个协议的名称,如 http 或 ftp。{target} 通常是一个网络地址,但是面向非网络的协 议则可能把它当作一个相当灵活的字段来处理。还有一些参数,如 {params} 被指定为一系列形如 ";x=y" 的分配形式(例如,;myParam=value)。 1.1.11 javax.microedition.io 帮助接口 除类属连接工厂类之外,javax.microedition.io 软件包中还包含下列面向连接的接口: · Connection -- 定义了最基本的连接类型。这个接口也是此软件包中所有其它连接接口的基本类。 · ContentConnection -- 定义了一个可以通过内容的流连接。 · Datagram -- 定义了一个类属数据报接口。 · DatagramConnection -- 定义了类属数据报连接和它必须支持的性能。 · InputConnection -- 定义了一个类属输入流连接和它必须支持的性能。 · OutputConnection -- 定义了一个类属输出流连接和它必须支持的性能。 · StreamConnection -- 定义了一个类属流连接和它必须支持的性能。 · StreamConnectionNotifier -- 定义了一个流连接的通告程序必须具有的性能。 2. MIDP API 2.1 介绍 移动信息设备简表 (MIDP) 适合类似于蜂窝电话和寻呼机这样的设备。MIDP,就象 KJava 一样,同样 也建立在 CLDC 之上。MID 简表提供一种标准的运行时环境,允许在终端用户设备上动态地配置新的应用 程序和服务。 在本章中,我们将详细地讨论 MID 定义的七个软件包。我们还将建立一个 MIDP 应用程序示例。 2.2 UI 设计注意事项 MIDP 包括一个低级的 UI API 和一个高级的 UI API。低级的 API 允许您完全访问一个设备的显示 屏,也允许访问原始键和指针事件。然而,使用低级 API 时, 没有可用的用户界面控件。应用程序必须 精确地绘制出按钮和其它所有的控件。 相反,高级 API 提供简单的用户界面控件但不能直接访问原始的输入事件或显示屏。由于显示屏的尺 寸和 MIDP 设备输入方法的差异,控件显得很抽象。MIDP 的实现确定了绘制控件的方法,也确定了如何管 理用户输入。 让我们在后面的章节里更进一步了解 MIDP 的软件包和类。 2.2 MIDP API MIDP 包含四个核心 CLDC 软件包 (java.lang、java.io、java.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, 指出在不合法或不合适的时间已 经调用的一个方法。 2.3 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应用的周期。 MIDlet 在应用程序生命周期中有三种可能的存在状态 -- 运行状态、暂停状态、销毁状态。运行状态,正 如其名称所暗示的,意味着 MIDlet 正在运行中。这种状态始于 startApp 方法被调用时。在暂停状态 中,MIDlet 持有的所有资源将被释放,但是它准备着再次被运行。调用 notifyPaused 方法时,MIDlet 处于暂停状态。在销毁状态中,MIDlet 已经永久地将其自身关闭,释放所有的资源,等待着废物清理程序 的处理。它是通过 notifyDestroyed 方法来调用的。 在接下来的两页中,我们来看一个简单的 HelloWorld MIDlet。 2.4 HelloWorld MIDlet 这个 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(); } 2.5 MIDP 软件包 除标准 CLDC 软件包之外,MIDP 还包含三个附加的软件包: · javax.microedition.lcdui -- 定义用来控制 UI 的类。这个软件包既包含高级 UI 类(例如 Form、Command、DateField 和 TextField 等),又包含低级 UI 类(允许用低级方式控制 UI)。 · javax.microedition.midlet -- 包含 MIDP 主类中的一个,MIDlet 类,为 MIDP 应用程序提供访问 关于其运行所在环境信息的权限。 javax.microedition.rms -- 定义一个类的集合,这些类为 MIDlet 提供了永久存储并随后重新得到数 据的机制。 2 具体 API 集差异 在本章的第一部分,通过对J2ME的cldc配置和mdlp简表的介绍,我们已经了解了很多J2ME的编程和J2SE的 差异。在这一部分,我们将通过对具体各种类型的API功能编程的不同,来比较和分析这两种开发模式的差 异。 2.1 In/Out 这里是标准J2ME的io规范 初看到J2ME的版本,也许你会觉得很意外,因为比起J2SE的版本,IO的功能要弱化很多。 下面这张图是标准J2SE的IO框架,如果要查询J2SE的具体的IO输入输出的类别,可以参考Sun的javadoc api文档。 2.2 String 操作 一般说来,J2ME和J2SE的string操作差别不大,但是正如前面第二章提到过的,JVM和KVM的差异以及两个 平台的API不同,有些时候有些很细微的差异,虽然两个平台都有String和Stringbuffer的类别,但是 string的split/replaceall方法,在J2ME中是不支持的。 所以在编制具体应用的时候,如果发现有些类别方法不工作,就需要考虑自己构造一个实现。 如下是J2SE的API方法截图: 这里就是一个在 J2ME 中分割 split 方法的实现。 /** * 分割字符串,原理:检测字符串中的分割字符串,然后取子串 * @param original 需要分割的字符串 * @paran regex 分割字符串 * @return 分割后生成的字符串数组 */ private static String[] split(String original,String regex) { //取子串的起始位置 int startIndex = 0; //将结果数据先放入 Vector 中 Vector v = new Vector(); //返回的结果字符串数组 String[] str = null; //存储取子串时起始位置 int index = 0; //获得匹配子串的位置 startIndex = original.indexOf(regex); //System.out.println("0" + startIndex); //如果起始字符串的位置小于字符串的长度,则证明没有取到字符串末尾。 //-1 代表取到了末尾 while(startIndex < original.length() && startIndex != -1) { String temp = original.substring(index,startIndex); System.out.println(" " + startIndex); //取子串 v.addElement(temp); //设置取子串的起始位置 index = startIndex + regex.length(); //获得匹配子串的位置 startIndex = original.indexOf(regex,startIndex + regex.length()); } //取结束的子串 v.addElement(original.substring(index + 1 - regex.length())); //将 Vector 对象转换成数组 str = new String[v.size()]; for(int i=0;i mylog.txt 最后系统的 event log 中,可以看到如下输出, guid:0x9C3CD62E3320B498 time: Thu Jun 17 17:09:03 2010 severity:1 type:3 app:Java Exception data: RuntimeException blocking operation not permitted on event dispatch thread net_rim_cldc-19(4BAE2663) EventThreadCheck throwException 0x1F87 net_rim_cldc-18(4BAE2663) NativeTransport send 0x76D1 net_rim_cldc-19(4BAE2663) Transport send 0x9266 net_rim_cldc-19(4BAE2663) Protocol send 0x3702 Smsfor8910(4C19EC08) Smsfor8910RIMResources 0x114 net_rim_cldc-11(4BAE2663) Field fieldChangeNotify 0xBCD net_rim_cldc-14(4BAE2663) ButtonField 0x270C net_rim_cldc-14(4BAE2663) ButtonField trackwheelUnclick 0x22E0 net_rim_cldc-12(4BAE2663) Manager trackwheelUnclick 0x249D net_rim_cldc-12(4BAE2663) Manager trackwheelUnclick 0x249D net_rim_cldc-12(4BAE2663) Screen trackwheelUnclick 0x9693 net_rim_cldc-12(4BAE2663) Screen dispatchNavigationEvent 0x71CD net_rim_cldc-13(4BAE2663) UiEngineImpl processMessage 0x7964 net_rim_cldc-8(4BAE2663) Application 0x29A4 net_rim_cldc-8(4BAE2663) Application processNextMessage 0x1ADD net_rim_cldc-8(4BAE2663) Application enterEventDispatcher 0x1A1A Smsfor8910(4C19EC08) MyThread run 0x9A
还剩33页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 20 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

BlackBerry

贡献于2010-09-15

下载需要 20 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf