慢谈J2ME

Java的开发者们最初开发它的动力并不是Internet,而是把它作为开发嵌入到电子设备中的软件.
这可以说就是J2ME的前身. 可以说Java的最初就是用在J2ME方面的.
当时,由于Internet更具竞争性,挑战性等原因,所以Java的开发者们改变方向,向Internet进发. 这可以说是Java能够成名的一个很重要的原因.

在这期间,小型计算设备,如移动电话,有线电视的数字机顶盒(set-top box),汽车导航系统,寻呼机, 个人数字助理(Personal Digital Assistant,PDA),智能卡(smart card)等开始有了非常大的发展.
于是乎,Java的开发者又重操旧业,重新去搞J2ME,
在Java刚出生的时候,小型计算设备市场也是刚刚发展起来.


1990年12月,
Sun内部由James Gosling、Patrick Naughton以及Mike Sheridan成立了一个叫做Green Team的小组.
Green Team小组的主要目标,是要发展一种新架构,而这种架构必须能够在消费性电子产品作业平台上运行,现在我们普遍认识的PDA、手机或是信息家电(IA),都是属于这种架构的目标平台.
接着,Green Team在1992年的9月3号,发表了一款由Java 技术之父 James Gosling所领军研发,名叫Star Seven(*7)的机器,研发出一部交互式的掌上型家用娱乐装置,可透过使用动画触碰式屏幕的使用者接口来控制其它电子设备.
经过了13年的时间,现在我们检视J2ME的发展历史,我们可以发现,
虽然在1999年,Java被切割成J2SE、J2ME、J2EE,所以有了J2ME这个名词的出现.
但是Java并非1999年开始才开始发展嵌入式系统上的应用.
其实,Java本来就是为了嵌入式系统而发展的一种架构.即使目前大家多半将Java的应用聚焦于企业上的J2EE应用.但是严格来说,J2ME才是Java真正"回归本心"的领域.
http://www.javanb.com/j2me/1/3215.html


J2ME在1999年的JavaOne开发人员大会初次亮相.

J2ME(Java 2 Micro Edition)中的Micro可以翻译为 ,J2ME的中文名称可以叫做 Java 2微型版 .

J2ME是Java API和JVM虚拟机的一个缩减版本

J2ME针对两个方面的市场,第一是高端消费类电子设备,另一个是低端消费类电子设备.

1.高端消费类电子设备,如汽车娱乐/导航系统,电视机的数字机顶盒等等.
这些产品有2MB~4MB的内存.在J2ME中可以算是很大的内存了.

2.低端消费类电子设备,
如双向通讯设备(如手机),个人数字助理(Personal Digital Assistant,PDA)等等.

当然在这个市场中,大家最熟悉的产品应该是手机了.

由于制造成本的约束,今天大量的的无线设备(比如手机)中的大多数,都属于低端消费类电子设备.

所以,你可以粗略的认为J2ME是关于手机程序设计方面的,

但是这只是粗略的,实际上并不是如此.

这是因为手机在J2ME产品中最常见的,使用率可以算是最高的.

大家最熟悉的小型计算设备应该是手机.但是你不要认为J2ME就只有手机程序设计这块.

我记得好像在Java手机程序设计这方面做的最好的是日本.


  

J2ME由3部分(或者说"J2ME体系架构由3层") 组成.

这3部分(层)分别是
配置层(Configuration),规范层(Profile)和可选包(optional packages).


Profile层是Configuration层的细化,

Configuration是针对非常广泛的设备,而Profile是针对这些设备中的某一块.

例如,
Configuration层中的CLDC是针对低端消费类电子设备的,而Profile层中的MIDP是针对双向通讯设备(如手机)这一块的.
前面已经说过了,双向通讯设备是在低端消费类电子设备中的一类.

一.J2ME配置
连接设备配置(Connected Device Configuration,CDC)
针对高端消费类电子设备.

连接有限设备配置(Connected Limited Device Configuration,CLDC)
针对低端消费类电子设备.


二.J2ME Profile
Profile是由特定小型计算设备或某一种类的小型计算设备实现功能的Java类组成的.


Sun共定义了7种profile:

1.Foundation Profile    
供CDC配置使用.
JSR为219,
点击以下链接即可查看:
http://java.sun.com/javame/reference/apis/jsr219/

2.Game Profile
对应WTK安装目录中的

3.Mobile Information Device Profile(MIDP)
最新的是MIDP 2.0,
JSR(JSR的英文全称是Java Specification Request,它应该是起编号之类的作用吧!Java的规范太多了)为118
点击此处下载

4.PDA Porfile

5.Personal Profile
JSR为216,
点击以下链接即可查看
http://java.sun.com/javame/reference/apis/jsr216/

6.Personal  Basis Profile
JSR为217,
点击以下链接即可查看
http://java.sun.com/javame/reference/apis/jsr217/

7.RMI Profile
JSR为66
点击以下链接即可查看
http://java.sun.com/javame/reference/apis/jsr066/

Profile这个单词可以理解为规范.


三.Optional Packages(可选包)
JSR 179:Location API for J2ME(J2ME地理定位API)
我在JCP( http://www.jcp.org/en/jsr/all )下载这个规范的时候,网址被链接到了Nokia的官方网站.
这个API的作用是向Java应用程序报告设备的当前物理位置的有关信息.

Bluetooth这个英文单词实际上是2个单词结合后形成的,
blue是蓝色的意思,而tooth,是牙齿的意思.
所以这个单词的意思就是蓝牙.

关于Bluetooth,Sun公司有一个API,它的JSR是82
其实也只有一个叫javax.bluetooth的包而已.
点击以下链接即可查看
http://java.sun.com/javame/reference/apis/jsr082/

关于智能卡,Sun公司有一个规范(Specification), 这个规范的最新版本是v2.2.2
点击以下超链接即可下载
Java Card(TM) 2.2.2 FR Specification


关于Bluetooth和智能卡(smart card)应该就是可选包.



      图1  J2ME的三层



我们平时所编写的J2ME程序就是基于这3层的.


初学J2ME,使用的配置层是CLDC(目前最新的是CLDC 1.1),

规范层是MIDP(是上面提到的7个profile之一),


初学J2ME主要用到的一个开发工具是WTK(J2ME Wireless Toolkit,目前最新的版本是2.5.1).
点击下载WTK 2.5.1

WTK的名称是J2ME无线工具包.
只要这样在配合上JVM就可以开发J2ME程序了.
关于WTK的使用方法可以看"WTK的使用方法" 这篇日志


当然还有JVM(Java Virtual Machine),要不然这个WTK怎么安装、使用啊!

请记住,Java是在JVM中运行的(正因为这样,Java才能实现可移植性和Write Once,Run Anywhere:一编写一次,到处运行).


MIDlet  Suite

当你决定编写第一个J2ME程序时,你创建了一个类叫BasicMIDlet,
这个类必须继承javax.microedition.midlet.MIDlet类.
原因很简单,因为要启动MIDlet(其实是启动你自己创建的MIDlet,也就是BasicMIDlet)需要用到一个startApp()方法.而暂停MIDlet使用的是pauseApp()方法.终止MIDlet则使用的是destroyApp(boolean arg0)方法.
这3个方法是在MIDlet类中的.
MIDlet是MIDP的基本执行单元.

例1    第一个J2ME程序
package j2me;

import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class BasicMIDlet extends MIDlet
{
protected void startApp() throws MIDletStateChangeException
{
  
}
protected void pauseApp()
{
  
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException
{
  
}
}

注意, startApp()和destroyApp(boolean arg0)方法有可能会抛出javax.microedition.midlet.MIDletStateChangeException异常.

J2ME的用户界面设计不同于一般的AWT或Swing,
因为J2ME所面对的一个事实是小型计算设备的资源是非常有限的.
CLDC设备的内存只有128~512KB.
还有一点就是Swing它占用了太多的内存了.根本不适合这些小型计算设备.

J2ME的用户界面设计由
javax.microedition.lcdui包和javax.microedition.lcdui.game包负责的(这2个包是在MIDP中的).
 
javax.microedition.lcdui.game包针对的是游戏用户界面.是用在J2ME游戏设计方面的.

lcdui的全称是liquid crystal display user interface (LCD UI),中文意思就是"液晶显示用户界面".

 
javax.microedition.lcdui包可以分为2个部分:高层显示Screen和和低层显示Canvas

不过它们都是javax.microedition.lcdui.Displayable(它的父类是Display)的子类.




无论是高层还是低层显示,要让它能够在显示设备中显示出来,需要2步.              
第一步,创建Display类的实例(也就是创建对象).
Display对象的创建方法是Display.getDisplay(MIDlet midlet);
当您创建自己的J2ME类时,都必须继承javax.microedition.midlet.MIDlet类,所以上面的方法也可以写成Display.getDisplay(this);
this是对象引用,引用的是你自己创建的类.
第二步,使用setCurrent(Displayable displayable)方法
它是Display类的方法,所以只有创建Display对象才能调用这个方法.

为什么使用这样的办法呢?因为现在的许多的J2ME产品的显示和键盘的配置差异很大,就举手机来说,单Nokia(诺基亚)的手机的外形就有好几种啊!

其实Sun公司在重新开发J2ME的过程中,
遇到最大的困难就在于现在的J2ME产品之间的差异都非常大,
那么开发出来的J2ME要尽量的统一,也就是说,尽量使J2ME的程序能够适用于任何的J2ME产品.

Sun公司做到了,而且做的非常之好,这其中与Nokia,Motorola(摩托摩拉),Samsung(韩国三星)这些公司的积极参与是分不开的(当然还有非常多的公司也参与了,这里就不列举了).

所以,可以说,现在大部分的J2ME产品都是使用Sun公司的开发的J2ME

毕竟,Sun公司的老本行就是J2ME,Java最初就是用在这方面的.



例2    
package j2me;

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

public class TextBoxMIDlet extends MIDlet
{
private TextBox textbox;
private Display display;
    public void startApp()
    {
        display=Display.getDisplay(this);
     textbox=new TextBox("Hello World","My first MIDlet",40,0);
        display.setCurrent(textbox);
   }
   public void pauseApp()
   {
    
   }
   public void destroyApp(boolean arg0)
   {
  
   }

}



你是否会有疑惑,这上面这段代码中setCurrent()中的参数不是Displayable类的引用.Why?
原因很简单,TextBox(它的父类是Screen)是Displayable的间接子类.
你会发现一点, pauseApp()和destroyApp(boolean arg0)方法都是空的.
事实上这两个方法可以为空.


高层显示Screen

      
图3   Screen类及它的子类

我个感觉J2ME中的图形用户界面与SWT(Standard Widget Toolkit,IBM创建的GUI库,从功能上来说,SWT与AWT/Swing是基本等价的)有些相似

标题的慢字,并非我打错字,因为我是刚开始学这个东东,所以,得慢慢谈这个东东了.  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值