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是基本等价的)有些相似
标题的慢字,并非我打错字,因为我是刚开始学这个东东,所以,得慢慢谈这个东东了.
这可以说就是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 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
这个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
点击以下超链接即可下载
关于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是基本等价的)有些相似
标题的慢字,并非我打错字,因为我是刚开始学这个东东,所以,得慢慢谈这个东东了.