1.j2me的技术框架是由配置,简表和厂商可选可构成的一个完整的运行环境
1.1配置:是指针对某一类设备的最小的java平台,它包括满足该类设备的虚拟机运行的最小子集和针对该设备的核心类库的最小子集主要有两种:CDC(Connected Device Configuration连接设备配置)和CLDC(connected Limited Device Configuration连接有限设置配置)
1.2简表:是架构在配置之上的规范,因此每种简表都会声明它根植于的配置种类。SUN推出两种简表:基础简表(主要配置CDC使用基础简表的可以访问完整的J2SE的特性集)和MIDP(主要配置CDLC,支持有限的J2SE类库的有限子集)。
1.3厂商可选包:指的是由厂商提供类库开发出具有特定功能的应用程序。
2.CLDC
2.1包含的功能:1)java核心语言与JAVA虚拟机的特性 2)核心java类库 3)输入/输出 4)对网络的支持 5)对安全和国际化的支持
不包含的功能:对应用程序生命周期的管理,用户界面,事件处理,高级应用程序模式(用户与程序的交互)
2.2安全模型
1)底层安全机制:主要是类验证
2)应用级别安全机制:java应用只能访问某些设备环境允许访问的类库、系统资源和其他组件
2.3类预审核机制:是在编译时进行的,主要包括:1)所有本地变量在使用前必须初始化、2)在构造对象时,其构造函数必须在该对象被使用前调用、3)每个对象的构造方法都必须调用父类的构造(要求最先调用java.lang.object的构造方法、4)本地变量、实例和静态成员在声明时指明的对象类型必须与实际赋值的类型一致
2.4CLDC的类库
1.java.long
1)jvav.long.object类没有finalize方法也没有接口CLonealbe,因此没有默认的clone方法
2)数据类型只有boolena,byte,char,integer,long,short,string
2.java.util
1)集合类只有hashtable,stack,vector,enumeration而且是直接从java.lang.object直接继承
2)date类,多个日期比较只能用equals
3.java.io
4.javax.microedition.io:定义了GCF中的类和接口,最关键的是Connector类和Connection接口,Connector类中定义了静态的方法生成特定类型的Connection接口,利用这个接口可以访问网络和各种其他设备
3.MIDP(移动信息设备简表)
MIDP的范围,提供的API有应用程序模型,用户界面支持,网络支持,持久化存储支持,声音,2D游戏,通过HTTPS和安全套接字的端对端的安全性,Midlet签名模型提供的附加安全性,应用程序的递送和安装,其他类如定时器类的异常类
移动信息设备上的应用程序在类型
MIDP型:MDIP应用程序或称为Midlet,是只使用MIDP和CLDC定义的API的应用程序。这种应用程序是针对MIDP规范开发的,是移动信息设备上使用最广泛的应用程序。
DEM特殊类型:OEM专用应用程序,依赖于一些不属于MIDP规范的类。这些应用程序不可移值。
本地型:本在类型应用程序不是用java开发的(一般是用C开发的本地系统软件程序),但运行在移动信息设备和本地操作系统上
4.搭建移动应用开发环境
4.1EclipseME提供了:多无线开发包的支持,利用向导建建J2ME Midlet Suite工程,利用应用向导创建Midlet,启动仿真器,支持Midlet的调试,OTA仿真,自动Midlet签名
4.2开发环境:JDK+Eclipse+EclipseME+Sun WTK(或Nokia/Sony...)
1).安装EclipseME插件:help->Software Update->FInd Update->Install/Update,然后选择[Search for new features to install]->[New Archived Site]选择下载的me插件文档更新即可
2).配置EclipseME组件:[windows]->[Preference]->[java]->[Build Path]->[Folders]
[Debug]->取消[Suspend Execution on uncaught Exceptions]和[Suspend Exection on compilation Errors],并装[Debut timeout]设置为15000
[J2ME]->[New Midlet Suite]选中
3).将sun wtk和EclipseME插件整合:在[j2me]->[platform]/[j2me]-[wtk Root]
5.Midlet编程基础
5.1什么是Midlet:Midlet是支持在MIDP规范的移动信息设备上运行的应用程序。他不是一个单独的文件,而是一个文件的集合,它除了必须包含一个继承自javax.microedition.midlet.Midlet的类之外,还包括此类执行时所需的其他类的资源文件。而且Midlet必须运行在MIDP实现的特定的环境中。
与Midlet有关的还有一个重要的软件--应用程序管理器,它是一个使用本地代码(c)编写的程序,负责将Midlet Suite安装到机器上执行,经及管理Midlet的生命周期。
5.2Midlet程序
1)Midlet应用程序必须继承javax.microedition.midlet.Midlet类.
2)三个抽象方法:startApp(),pauseApp(),destroyApp(),应用程序管理器通过这三个抽象方法来控制Midlet的生命周期,因此必须实现 他们
5.3Midlet的生命周期包括三个状态:暂停,激活和销毁。这三种状态是应用程序管理器通过调用Midlet的三个回调函数来实现的。当Midlet被执行时,应用管理器先调用其构造函数创建一个实例。然后在转换成激活状态。
只有应用程序管理器才能改变Midlet的状态。但是Midlet也可以间接的调用管理器来改变自己在状态。有三个函数:notifyPaused(转换到暂停),notifyDestoried(转换到销毁状态),resumeRequest(转换到激活状态)。
要注意的是由Midlet调用的状态转换函数与应用程序管理器调用的是有差别的。例:由Midle调用的nofifyPaused时不会调用pauseApp函数。所以在手动调用notifyPaused时最好先调用pauseApp()
5.4Midlet开发流程
先配置两个系统变量:
J2MEAPI=WTK_HOME\LIB
可分为:编码,编译,预审核,测试,打包,混淆,发布,下载,运行
预审核
preverify -classpath 审核类文件路径 -d 源class文件目录 输出class文件目录
打包
jar -cvf outname.jar *.class
发布到服务器上:
1).建一个.wml文件,并把这个文件和*.jad和*.jar文件考到Web服务应用目录中
xml version="1.0"?>
" http://www.wapforum.org/DTD/wml_1.1.xml">
SoftWare center:
HelloJ2ME
2).在jad描述文件添加MIDlet-Permissions: javax.microedition.io.Connector.http
用WTK来发布应用程序
1)[New Project]在[MIDlet Class Name]中输入的与源.java文件名相同,这时把.java文件拷到工程的[src]目录中然后Build
2)将Midlet需要访问的许可添加到JAD文件中[Setting]-[Permissions]-[Midlet Permission]-[Add]-[http]
3)[Package]-[Create Package]进行打包
4)签名处理[Project]-[Sign]创建一个新的数字证书,然后[Sign Midlet Suite]
5)用OTA运行到仿真器上[Projcet]-[Run via OTA]
5.5获取应用属性信息
jar描述文件或清单文件mainifest.mf中可以包含一些与具体应用相关的属性信息,可以通过Midlet.getAppProperty()
取得,也可以取自定义的属性信息
5.6获取系统平台信息:System.getProperty()
microedition.platform:主机平台或设备的名称
microedition.encoding:默认编码格式
microedition.configuration:所支持的配置版本
microedition.profiles:所支持的简表名称
microedition.local:设备的当前地区
5.7获取内存容量
Runntime runtime=Runntime.getRunntime();
runtime.totalMemory():虚拟机的总存储存量
runtime.freeMemory()剩余存储容量
6.MIDP高级界面(LCDUI)
为了在设备上显示信息,需要取得设备的显示屏幕。Display对象代表的是移动设备显示屏幕,第个Midlet都有且仅有一个Display对象。可以通过静态方法Display.getDisplay(Midlet midlet)得到。使用高级界面时由Screen对象,低级屏幕由canvas对象。通过Display.setCurrent()方法将抽象屏幕对象绑定到当前设备屏幕上
6.1LCDUI的体系结构
[Display]
|
[Displayable]
/ \
[Ticker] -- [Screen] [Canvas]
/ / \ \
[TextBox] [List] [Alert] [Form]
|
[Item]
/ / | \ \
[choiceGroup][DateField] | [ImageItem][StringItem]
/ | \ \
[TextField][Gauge][Spacer][CustomItem]
6.2高级用户界面编程基础
6.2.1Dispaly对象:进行用户界面的管理,负责与应用程序管理进行交互。
常用方法:
1)void callSerially(Runnable r)用来序列化事件流,使Runnable对象R的run方法在重车周期完成后马上运行
2)Displayable getCurrent()获得Midlet的当前Displayable对象
3)static getDisplay(Midlet m)获得Midlet唯一的Display对象
4)Boolean isColor()获得设备所支持的色彩信息
5)int numColors()获得设备表示的彩色数或灰度级
6)void setCurrent(Alert a Displayable d)请求设置alert对象为当前显示对象
7)void setCurrent(Displayable d)请求将Displayable对象设置为当前显示对象
8)public boolean flashBacklight(int duration)控制屏幕背景灯闪烁
9)public boolean vibrate(int duration)控制手机震动
6.2.2Displsyable对象:是在显示屏设备上显示的用户界面对象,同一时刻的应用程序只能有一个Displayable对象
1).void setCurrent(Displayable b)将Display对象绑定到显示设备上
6.2.3Ticker对象:实现了屏幕上连续滚动的滚动条或小段文本
创建Ticker对象后可以用setTicker来设置屏幕上的Ticker对象
Form.setTicker(new Ticker("测试..."));
6.3Command处理机制:Command对象就类似于普通GUI编程的按钮
Command的8种类型:BACK、EXIT、CANCEL、HELP、ITEM、OK、SCREEN、STOP
如果要响应Command命令要实现CommandListener接口的commandAction方法。并用Dispalyable对象的setCommandListener()方法来注册Command和Listener
用Command实现用户命令响应的步骤
1)创建一个Command对象; Command OK=new Command("确定",Command.OK,1)
2)将Command对象添加到From、TextBox、List、Canvas上; Displayable.addCommand(OK)
3)创建一个Command监听器,实现CommandListener接口的commandAction方法
4)调用setCommandListener来注册监听器; Displayable.setCommandListener(CommandListener lisener);
5)调用commandAction方法来对命令事件进行响应
public void commandAction(Command c,Displayable s)
{
String cmd=c.getLabel();
if(cmd.equals("确定"))
.....
else if(cmd.equals("取消"))
.....
}
6.4Screen对象:是所有高级用户界面组件都基于Screen类。在实际开发中,一般不直接用Screen对象,而是使用Screen的4个类:TextBox 、List、Alert、From。其中TextBox、List、Alert代表一个完整的抽象屏幕,不能有父容器,必须独占屏幕
6.5List组件
6.5.1Choice接口:javax.microedition.lcdui.choice接口
Choice接口的主要字段:
1)static int EXCLUSIVE:代表一次只有一个元素被选择的Choice类型
2)static int IMPLICIT :类似命令菜单或按钮的Choice类型,当某个元素被选中的时候自动触发Command事件
3)static int MULTIPLE :代表一次可以有任意个元素被选择的Choice类型
Choice接口的主要方法
1)int append(String s,Image m):追加一个元素到Choice中
2)void delete(int index):删除由index所指定的元素
3)void insert(int indxe,String s,Image m):在索引为indxe的元素后插入一个元素
4)void set(int index,String s,Image m):设置索引index元素的内容
5)int getSelectedFlags(Boolean[] r):以boolean数组的形式返回所有元素的状态
6)void setSelectedFlags(Boolean[] r):设置Choice中所有元素的状态
7)boolean isSelected(int index):返回索引为indxe元素是否被选中
8)void setSelectedIndex(int indxe,boolean selected):设置索引为indxe的元素的选中状态
9)int size():获得Choice接口的元素数目
10)Image getImage(int index):获得索引为index的元素的图像部份
11)String getString(int index)获取索引为index的元素的字符串内容
6.5.2List对象使用
List list=new List("标题",Choice.EXCLUSIVE);
list.append("内容1",null);
如果添加图像:
Image image=Image.createImage("/image.jpg");
list.app("内容1",image);
如果List对象是多选,必须循环查看选择状态用isSelect(int index)或用getSelectedFlags();
6.6 TextBox组件:用于生成一个允许用户输入和编辑文本的屏幕。
public TextBox(String title,String text,int maxSize,int constraints)
标题 初始文本 文本框最大尺寸 限制用户的输入:由TextField和TextBox类共享使用
内容限制类型:
TextField.ANY: 允许输入任何字符
.EMAILADDR: 必须输入E-Mail地址
.NUMBER: 整数
.decimal: 可以用Double.valueOF()来转换
.PHONENUMBER: 电话号码
.URL URL地址
系统属性限制类型:
TextField.PASSWD:文本以*蒙盖
.UNEDITABLE:只读不可编辑
.SENSITIVE:禁止系统通过自动完成功能存储信息
.NON_PREDICTIVE:屏蔽设备输入法的预测功能
.INITIAL_CAPS_WORD:自动将每个单词的首字母转换为大写
.INITIAL_CAPS_SENTENCE:自动将每个句子的首字母转换为大写
TextBox的主要方法
1)int getConstraints():
2)void setConstraints(int c):
3)int getMaxSize():
4)void setMaxSize(int size):
5)String getString():
6)void setString(String str):
7)int size():
8)void delete(int offset,int length):
9)void insert(char[] data,int offset,int length,int position):
10)void insert(String src,int position):
11)void setChars(cahr[] data,int offset,int length):
6.7 Alert组件:是一个显示文本和图像的普通屏幕。它通知用户出错及另外一些异常信息。一个Alert可以是模式的也可以是定时的
Alert的主要方法
1)int getDefaultTimeout():获得Alert默认的显示时间的长度
2)int getTimeout():获得Alert的显示时间长度
3)void setTimeout(int t):设置Alert的显示时间长度
4)Image getImage():获得Alert所使用的图像
5)String getString():获得Alert的文本字符串
6)AlertType getType():获得Alert的类型
7)void setImage(Image image):设置Alert所使用的图像
8)void setString(Stirng s):设置Alert所使用的字符串
9)void setType(AlertType type):设置Alert的类型
10)void setTimeout(int t)设置Alert显示的时间
AlertType类型:ALARM,CONFIRMATION,ERROR,INFO,WARNING
6.8 Form:是一个特殊的屏幕对象。本身不提供能够与用户直接交互的用户界面,而是作为一个容器容纳其他的可视组件,这些组件称为
表单元素,都是Item的了类。
Form的主要方法:
1)Form(String title):构建一个新的Form对象
2)Form(String title,Items[]):构建一个新的Form对象
3)int append(Image image / String s / Item item):为表单增加一个图像、字符串、Item对象
4)void delete(int itemnum):删除由索引itemnum指定的元素
5)item get(int itemnum):获得由索引itemnum指定的元素
6)void insert(int itemnum,Item item):插入一个元素到表单指定元素之前
7)void Set(int itemnum,Item item):用Item对象替换指定索引位置的元素
8)void setItemStateListener(ItemStateListener i):为表单设置事件监听器
9)int size():获取表单中元素的个数
6.8.1 StringItem组件:以不同的外观类型在屏幕上显示一串文字信息
StringImage(String label,String text,int appearanceMode)
标签 内容 外观:Item.PLAN(普通)/BUTTION(按钮)/HYPERLINK(超链接)
6.8.2 Item组件的命令处理机制,要实现接口ItemCommandListener的commandAction(Command c,Item i)方法
1)一个Command数组它包含关联到此Item对象上所有的Command命令,可以通过addCommand/removeCommand来添加或删除
2)一个defaultCommand变量,它指向Command数组中的一个Command命令。可以通过setDefaultCommand来设置
3)一个ItemCommandListener的引用,代表注册到此Item对象的命令监听
例:
StringItem str1=new StringItem("人事部:","负责人事管理",Item.PLAIN);
StringItem str2=new StringItem("市场部:","负责市场管理",Item.BUTTON);
StringItem str3=new StringItem("财务部:","负责财务管理",Item.HYPERLINK);
str1.addCommand(new Command("进入",Command.OK,1));
str1.addCommand(new Command("退出",Command.BACK,2));
str1.setItemCommandListener(this);
str2.addCommand(new Command("市场",Command.OK,1));
str2.addCommand(new Command("取消",Command.CANCEL,2));
str2.setItemCommandListener(this);
str3.addCommand(new Command("借款",Command.ITEM,1));
str3.addCommand(new Command("还款",Command.ITEM,2));
str3.setItemCommandListener(this);
6.8.3 ImageItem组件:MIDP中有两个类用于处理图像:Image和ImageItem。Item用于创建一个图像对象并包含高和宽以及图像是否可变等信息描述
ImageItem定义了如何显示一个图像,即图像是对中,靠左,上方等。
ImageItem(String label,Image img,int layout,String altText,int appearanceMode)
标签 图片 布局类型 图形无法显示时显示的文字 外观
外观与StringItem一样,布局类型:ImageItem.LAYOUT_LEFT、ImageItem.LAYOUT_CENTER、ImageItem.LAYOUT_DEFAULT
6.8.4 TextField组件:用来接收文本输入,与TextBox很类似,但是TextBox是多行的,TextField是单行的
更重要的是TextBox是一个完整的屏幕对象,而TextField是一个Item组件,只能被容器Form包含
6.8.5 ChoiceGroup组件:使用户可以从预先定义的一组条目中选择。与List类似。有多选和单选两种类型
ChoiceGroup(String label,int choiceType,String[] stringElem,Image[] imageElem)
标签 列表类型 标签字符数组 选项前的图标数组
例:
String[] item={"狮子头","红烧肉","宫保鸡丁"};
Image[] image={"image1","image2","image3"};
ChoiceGroup chice=new ChoiceGroup("选出你的午餐:",ChoiceGroup.MULTIPLE,item,image);
Form.append(chice);
6.8.6 Spacer组件:是一个不可见的组件,用于帮助在Form中定位其他项目的位置。只要指定每一个Spacer的宽和高,就可以用它提供
组件之间垂直和水平的间隔空间
6.8.7 DateField组件:提供了可视化地操纵在java.util.Date中定义的Date对象的方法
DateField(String label,int mode,TimeZone timezone)
标签 模式
模式:DateField.DATE_TIME(调整时间和日期)、DateField.DATE(调整日期)、DateField.TIME(调整时间)
6.8.8 Gauge组件:显示一个进度条:有两种类型交互式和非交互式
Gauge(String label,boolean interactive,int maxValue,int initialValue)
标签 类型 最大值 初始值
在MIDP2.0中添加了一个特性就是在Alert上添加Gauge组件。但要求1)必须是非交互的,2)不能同时在其他容器中,3)Gauge
的label必须为null,4)Gauge不能与Command和CommandListener关联
例:
Gauge gauge=new Gauge(null,false,max,initial)
Alert a=new Alert("label");
a.setIndicator(gauge) 把Alert和Gauge关联
Gauge gauge=a.getIndicator() 得到Gauge组件
6.8.9 获取Item组件状态:通过实现ItemStateListener接口中的itemStateChanged(Item item)方法
用setItemStateListener来注册状态变化监听
7低级用户界面
7.1 概述:两个关键类:Canvas和Graphics类。Canvas是一个抽象类,代表要绘制的抽象屏幕。为使用低层API建立用户界面必须建立Ganvas的一个子类,并实现paint方法。Graphics类的实例是作为参数传递给paint方法,它提供了设备绘图能力的入口
因此低级用户界面编程的核心任务在于:在Canvas类的paint方法中如何利用Graphics对象进行绘图操作
protected void paint(Graphics g)
{
g.setColor();
d.drawString();
}
此方法永远不会自选调用。新建一个Canvas对象时会自动调用这个方法。
7.2 Graphics绘图
void setColor():设置颜色,通过getBlue/Green/RedComponent分别得到RGB的值。或getGrayScale得到灰度值
绘图:
drawArc,Char,chars,Image....来绘制弧型,字符,字符数组,图像....
7.3 底层事件处理
7.3.1 检测支持特性
底层事件分为三类:Press Events(按键事件),Action Keys(动作事件),PointerEvents(触控事件)
键盘事件 支持 keyPressed(int keyCode)/keyReleased(int keyCode)
键盘连发 Canvas.hasRepeatedEvent
屏幕事件 支持 showNotify()
重绘事件 支持 paint(Graphics g)
支持双缓存 Canvas.isDoubleBuffered
支持触控 Canvas.hasPointerEvents
触控屏幕拖拽 Canvas.hasPointerMotionEvents
7.3.2 按键事件的处理
用来监控用户对于设备键盘的操作,方法有keyPressed,keyReleased,keyRepeated三个方法。当按键按下时会触发keyPressed方法;当松开时触发keyReleased方法;长时间按住时触发keyRepeated方法键值属性值:KEY_NUM0-9代表按键0-9,数值是48-57。KEY_STAR代表*号键数值是42,KEY_POUND代表#号键数值是35
7.3.3 触控事件的处理
触控事件处理(手写设备)的方法有pointerPressed(单击),pointerReleased(释放),pointerDragged()三个方法
7.4 屏幕事件处理
低级屏幕显示或隐藏时,将会自动触发屏幕显示或隐藏事件,并调用相应的回调方法。在Canvas显示前,MIDP会调用showNotify方法,用来在它被显示之前执行一些任务。当Canvas删除时,MIDP会调用hideNotify方法,用来执行对象删除后的工作。对于某些突发事件(比如来电)使屏幕被系统画面所覆盖的时候会调用hideNotify方法,当恢复的时候就会调用showNotify方法
Canvas有两种状态:普通状态;全屏状态(Title,Ticker,Command不会显示)。可以用setFullScreenMode来设定状态。在调用这个方法后都会调用sizeChanged这个方法。并将屏幕的高和宽作为参数传入