J2ME移动开发程序设计

J2ME移动开发程序设计

第1节 体系结构介绍与环境配置

J2ME简介\rJ2ME体系结构框架图\r开发环境的搭建与配置\r

J2ME简介

J2ME是Java 2 Platform Micro Edition的简写,是为机顶盒、移动电话和PDA之类嵌入式和移动电子设备提供的Java语言平台,它和J2SE、J2EE一起构成Java的三个平台。\rJava的三个平台

Java的三个平台

J2SE—Java 2 Standard Edition, Java 2技术标准版,以界面程序、Java小程序(Applet)和其它一些典型的应用为目标\rJ2EE—Java 2 Enterprise Edition, Java 2技术企业版,以服务器端程序和企业软件的开发为目标\rJ2ME—Jave2 Micro Edition, Java 2技术微型版,为小型设备、独立设备、互联移动设备、嵌入式设备程序开发而设计的

Three Java Platforms

J2ME体系结构框架图

Configurations(配置)

Configurations(配置):包含核心库、虚拟机(Java Virtual\rMachine)等,包括以下两种:

互联设备配置(CDC,Connected Device Configuration)\r 面向强大的可以间歇式的与网络连接的设备(有稳定的电 \r 源供应,设备性能强劲),如:机顶盒、Internet电视、家\r 用电器和汽车导航系统等。\r\r互联受限设备配置(CLDC, Connected Limited Device \r Configuration)主要面对大量的微型设备和嵌入式设备。\r

Profiles(描述)

手机属于互联受限设备,我们讲解的CLDC;相对应的描述称为MIDP (Mobile Information Device Profile),只支持CLDC这样的基础API远远无法满足实际的手机编程的需要的(比如图形界面),所以在CLDC API的基础之上,SUN公司又提供了专门针对手机功能的MIDP API。所以CLDC是MIDP的基础。

Optional Packages(可选包)\r 支持一些额外功能:蓝牙,三维等\r\rKVM: Java虚拟机(又称KVM,Kilo Virtual Machine),是所有Java程序运行的基础。对于手机来说,在手机出厂以前,已经固化在手机中了。\r\r

开发环境的搭建与配置

基本软件\r JDK1.6、WTK2.5.2、 Eclipse3.4、 EclipseMe1.7.7\r安装顺序\r开发环境的配置\r重要目录的介绍

基本软件下载及其安装顺序

JDK1.6\r 从http://java.sun.com/j2se上下载,安装\rWTK2.5.2 \r 从http://java.sun.com/j2me上下载,安装,安装过程中需要绑定JDK\rEclipse3.4\r 从http://www.eclipse.org上下载,解压缩,设置JDK环境变量PATH,测试\rEclipseMe1.7.7\r 从http://www.eclipseme.org上下载,需要将其分别和Eclipse、wtk进行绑定

开发环境的配置

Eclipse 和Eclipse Me绑定\rEclipse 和WTK绑定\r测试配置环境\r 需要集成手机模拟器(emulator)来进行程序测试工作,\r J2ME Wireless Toolkit 提供了4个模拟设备的模拟器,\r 各大手机厂商都拥有多种型号的手机模拟器:\r Nokia: http://www.forum.nokia.com/\r MOTO:http://developer.motorola.com等等

重要目录的介绍

apps\rbin\rdocs\rlib

第2节 高级界面开发(一)

基本界面\rCommand

CLDC(1.1)

java.io — JavaIO包,J2SEIO包的子集\rjava.lang — 核心语言包,J2SE核心语言包的子集\rjava.util —工具包\rjavax.microedition.io — CLDC通用连接框架类和接口

MIDP(2.0)

javax.microedition.midlet — MIDlet类包, 只包含一个MIDlet类可作为所有MIDlet的父类\rjavax.microedition.lcdui — 界面类包,对GUI组件提供支持,\rjavax.microedition.rms — 记录管理系统, 支持数据库系统的不同类和接口,用来存储和检索MIDlet所用的数据\rjavax.microedition.lcdui.game — Game API,MIDP2.0游戏编程扩展\rjavax.microedition.media — 多媒体类包\rjavax.microedition.media.control — 多媒体控制类包\rjavax.microedition.pki — 数字签名类包\r另外还有javax.microedition.io包中的一部分类。

创建第一个MIDlet

MIDlet(Mobile Information Devices let):手机上运行的J2ME应用程序,即移动信息设备小程序。以后我们编写的手机应用程序就是MIDlet\r用Eclipse创建第一个MIDlet应用程序\r运行,打包

MIDlet的三种状态

运行(Active)\r 程序正在运行中\r暂停(Paused)\r 程序处于暂停,若调用notifyPaused( )函数,MIDlet立刻进入此状态;MIDlet持有的所有资源暂时被释放,但它随时可能被运行;\r销毁(Destroyed)\r 程序被销毁,调用notifyDestroyed( )函数,MIDlet立刻进入此状态;MIDlet被永久地关闭并且释放占用的所有资源,等待着废物清理程序的处理。

配置文件:MANIFEST

用来描述MIDletSuite的配置,如:名称、版本、开发商等;MANIFEST 文件为纯文本文件,文件扩展名为.mf.\rMANIFEST 必须包含以下属性:

MIDlet-Name—MIDletSuite 的名称\r MIDlet-Version—MIDletSuite 的版本号,格式为主版\r 本.次版本.微版本,例如0.0.0,这也是版本号的默认\r 值。版本号主要用于安装或升级。\r MIDlet-Vendor —MIDletSuite 的提供商\r

JAD属性的说明

JAD 描述文件为纯文本文件,文件扩展名为.jad;说明具体的运行配置,以及Jar文件所在的位置的信息\rJAD 描述文件必须提供如下属性:

MIDlet-Name—同上\r MIDlet-Version—同上\r MIDlet-Vendor—同上\r MIDlet-Jar-URL—下载该MIDletSuite 的URL 地址。\r 虽然这里可以使用绝对位置或相对位置,但还是建议\r 用绝对位置。\r MIDlet-Jar-Size — JAR 文件的大小,计算单位为字。

MIDlet的基本结构

什么是高级界面\r案例:制作如右图所示的界面\r基础知识的了解

高级界面基础知识

MIDlet只是提供一个运行平台,上面的界面需要自己加上去\r什么样的东西能够加到MIDlet上?\r Displayble\r如何加呢?(由谁来管理呢)\r 用Display,它是用来管理系统的输入输出设备\r 要使组件能在屏幕上显示,必须取得屏幕上的Display对象: Display display = Display.getDisplay(this);\r Display显示可视组件的方法为:\r public void setCurrent (Displayable nextDisplayable);\r软键上方的菜单(命令按钮),是Command对象,不属于Displayable,只能依赖于Displayable

Display和Displayable

Display的其他作用\r获取设备支持的颜色: numColors()\r是否支持彩色:isColor()\r背景颜色,前景颜色:\r COLOR_BACKGROUND ,COLOR_FOREGROUND \r边框颜色,高亮边框色:\r COLOR_BORDER , COLOR_HIGHLIGHTED_BORDER \r高亮背景色,高亮前景色:\r COLOR_HIGHLIGHTED_BACKGROUND , \r COLOR_HIGHLIGHTED_FOREGROUND

Displayable的其他作用\r设置标题: setTitle\r添加、删除命令按钮: \r addCommand\r removeCommand

Display和Displayable

按钮类型(按照数字1-8排序,注意,这个数字不是优先级):\r SCREEN,BACK,CANCEL,OK,HELP,STOP,EXIT,ITEM

按钮类型

SCREEN:面向整个屏幕组件进行操作\r BACK:返回上一个操作时可用\r CANCEL,OK: 在有是否选择的情况下可用\r HELP:想要出现在线帮助时可用\r STOP:停止某个操作而不做屏幕切换\r EXIT:退出当前应用程序时可用\r ITEM:面向屏幕的局部进行操作\r

注意:\r 所有的事件代码需要自己写,按钮类型只是提供了一个分类而已\r

多个按钮加入界面的排布规律

不同种类的按钮,WTK优先级排序: ITEM,SCREEN,OK, HELP, BACK, EXIT ,CANCEL , STOP,优先级高按钮优先显示在上方\r同一种类的按钮,在构造函数内划分优先级,数字越小越优先\rBACK,CANCEL, EXIT, STOP倾向于抢占左方,优先顺序为: BACK,CANCEL, EXIT, STOP\r注意:只是在WTK内满足这个规律,其他模拟器可能不相同

第3节 高级界面开发(二)

Command事件\rList

命令按钮的事件响应

第一步:编写一个类,实现CommandListener\r第二步:重写里面的CommandAction方法,编写事件响应代码\r第三步:Displayable.setCommandListener()方法,将\r Displayable和该类绑定\rCommandAction的参数可以用来判断:\r

命令由哪个界面发出?\r 命令由哪个按钮发出?\r

实例

选择右边的1,2按钮,要求能够将按钮标题打印出来\r选择右边的第三个按钮,要求退出该程序\r选择左边按钮,要求将Form标题改为: 返回

List基本知识

List的三种类型

IMPLICIT:互斥\r EXCLUSIVE:另一种互斥\r MULTIPLE:可以多选

List选项

添加项,设置图片: append(“str”, \r Image.createImage(“filepath”))\r删除项: delete\r修改项: set\r得到某项文本或者图片\r设置字体:\r setFont(int,Font.getFont(face,\r style,size))

获得List选项

List选择事件——只针对IMPLICIT类型的List

List.setCommandListener()可以和事件响应接口直接绑定\r Command类型以List.SELECTEDCCOMMAND标定\r 实例:选择一项,将List标题变为该项内容

得到选择的项

单选:getSelectedIndex(),getString()\r 多选:\r 方法1:遍历各个选项,判断每项有没有被选;\r 方法2:getSelectedFlags然后判断哪些项被选

第4节 高级界面开发(三)

TextBox\rTicker\rAlert

TextBox及其用法

创建TextBox,指定标题,文\r 字,最大长度,输入限制\r常见输入限制:\r TextField.ANY\r获得光标位置\r getCaretPosition() \r获取文本: getString()\r插入文本:insert\r替换文本:setString,setChars\r删除文本:delete

Ticker及其用法

生成滚动条:Ticker\r显示/隐藏滚动条:\r setTicker\r获取或设置滚动条内容\r :set/getString

提示窗口: Alert

title:标题\ralertText:提示信息\ralertImage:图片\ralertType:类型\r ALARM:提醒\r CONFIRMATION:确认\r ERROR:错误\r INFO:通知\r WARNING:警告\rsetTimeout(int time):\r 设置持续时间\r利用Display进行切换

表单元素

第5节 高级界面开发(四)

什么是表单元素呢?\r Item的子类,可以通过Form.append(Itemitem)添加到界面上,不再占据整个屏幕\r

Javax.microedition.lcdui.Item

class javax.microedition.lcdui.ChoiceGroup (implements javax.microedition.lcdui.Choice) \rclass javax.microedition.lcdui.CustomItem \rclass javax.microedition.lcdui.DateField \rclass javax.microedition.lcdui.Gauge \rclass javax.microedition.lcdui.ImageItem \rclass javax.microedition.lcdui.Spacer \rclass javax.microedition.lcdui.StringItem \rclass javax.microedition.lcdui.TextField

ChoiceGroup

ChoiceGroup和前面学习的List类似,除了可以实现单选和复选之外还可以实现下拉菜单\r类型的确定:\r Choice.EXCLUSIVE: 单选\r Choice.MULTIPLE: 复选\r Choice.POPUP: 下拉菜单\r其他和List类似

DateField

java.util.Date\r创建DataField时的模式:\r DataField.DATE:只显示或修改日期\r DataField.TIME:只显示或修改时间\r DataField.DATE_TIME:显示或修改日期时间\r利用getDate得到相应的时间

Gauge

几个基本属性:

label:标题\rinteractive:是否可以修改进度条的值\rmaxValue:最大值\rinitialValue:初始值

重要方法:getValue,setValue

ImageItem

几个基本属性:

label:标题\rimage:图像\rlayout:布局方式:\r 常见左对齐,右对齐,居中等,可以通过|多选\raltText:图像不能装载时的提示文字

TextField

TextField和TextBox的区别:不能直接作为屏幕显示\r常见限制:

TextField.ANY: 任意字符\rTextField.EMAILADDR: Email\rTextField. NUMERIC: 整数\rTextField.DECIMAL: 小数\rTextField.PASSWORD: 密码\rTextField.UNEDITABLE: 不可编辑

其他用法和Textbox类似

StringItem

在屏幕上显示一个字符串\r常见属性

label:标题\r text:内容\r appearanceMode:显示方式\r Item.PLAIN\r Item.BUTTON\r Item.HYPERLINK

表单元素事件

第6节 高级界面开发(五)

ItemCommandListener

适用于在表单上将某个表单元素和命令按钮绑定\r用CommandListener能否做到?\r要点:

按钮加到Item上\r 实现ItemCommandListene\r Item和实现类对象绑定\r 按钮用ITEM类型

ItemStateListener

某个表单元素状态改变时触发事件\r要点:\r

实现ItemStateListener\r Form和实现类对象绑定

模拟手机写短信程序

第7节 案例1

案例:模拟手机写短信程序

程序载入,出现一个欢迎界面,右下按钮:写短信,左下按钮:退出程序\r选择“写短信”按钮,进入短信编辑界面,界面上有一个文本框供输入短信,框内有字时左下方显示:清除文本,否则显示:返回上一个界面;右下方显示按钮:发送。\r按发送,出现一个界面,左下方显示:返回;右下方显示:确定。上面有一个文本框输入对方电话号码,电话号码输入之后,按右下方的“确定”按钮,短信发出,在控制台上显示。

异常处理

第8节 异常处理

异常的出现

程序运行时由于一些不可预知的原因出现异常(如文件找不到,用户输入参数格式不对)\r举例:有一个函数,将一个字符串转成数字之后打印其平方,但如果字符串格式不对就会出现异常\r异常的特点:掠过该块内余下的代码

常见的异常

ArithmeticException: 算术异常,如除数为0 \rArrayIndexOutOfBoundsException:数组越界异常\rArrayStoreException:数组存储异常\rClassCastException:类型转换异常\rIllegalArgumentException:无效参数异常\rNegativeArraySizeException:数组尺寸为负异常\rNullPointerException:未分配内存异常\rNumberFormatException:数字格式异常\rStringIndexOutOfBoundsException:字符串越界异常

捕获异常

try{\r… … //可能出现异常的代码\r}\rcatch(Exception1 ex1)\r { /*处理1*/ }\rcatch(Exception2 ex2)\r { /*处理2*/ }\rcatch(Exception3 ex3)\r { /*处理3*/ }\r… …\rfinally{ //可选\r}

异常的两种处理方式

就地处理:用try---catch\r抛出,给客户端处理

在相应函数定义上增加throwsXXXException,\r 在代码内抛出该异常对象\r 客户端用try---catch来处理异常

自定义异常

举例:调用一个函数,当出现异常时,要求能够让客户端得知异常消息和异常发生的时间

多线程

第9节 多线程

线程及其实现

让应用程序看起来同时能做好几件事情,怎么办?\r你可以开一个线程\r案例:界面上有两个StringItem,要求第一个上面的数字每隔1秒钟变化,第二个上面的数字每隔两秒钟变化

线程实现的方法

方法1:Thread继承法\r

方法2:Runnable实现法

定义一个类,继承Thread\r 重写其run函数\r 对象调用start方法

定义一个类,实现Runnable\r 重写其run函数\r 定义一个Thread对象,将该对象传进去,调用\r start方法

线程的安全问题1:线程协作

线程1负责将1-1000的数字加起来,线程2负责得到这个结果,你会担心什么问题?\r等待一个线程运行完毕: join

线程的安全问题2:线程同步

线程1和线程2都负责访问同一个资源,你会担心什么问题?\r案例:有10张票,2个线程去卖它们,要求没有票时能够提示,请设计这个程序\r线程同步的重要关键字: synchronized

第10节

数值运算\r字符串处理\r时间管理

数值运算(一)

java.lang.Math类\rstatic double E :自然对数e \rstatic double PI :圆周率\rstatic double abs(double/float/int/long a):计算绝对值\rstatic double ceil(double a) :不小于一个数字的最小整数\rstatic double floor(double a) :不大于一个数字的最大正整数\rstatic double max(double/float/int/long a, double/float/int/long b) :两数中较大的那个\rstatic double min(double/float/int/long a, double/float/int/long b) :两数中较小的那个

static double sqrt(double a) :开方\rstatic double sin(double a) :正弦\rstatic double cos(double a) :余弦\rstatic double tan(double a) :正切\rstatic double toDegrees(doubleangrad) :弧度转角度\rstatic double toRadians(doubleangdeg) :角度转弧度\r注意:有些函数来源于CLDC1.1,CLDC1.0不支持\r

数值运算(二)

字符串处理(一):String

String: 处理不可变的字符串\rchar charAt(intindex) :返回某位置的字符\rboolean endsWith(String suffix)/startsWith(String prefix) :是否以某串结尾/开头\rboolean equals(Object anObject) /equalsIgnoreCase(String anotherString) :字符串相等/\r 不区分大小写情况下是否相等\rbyte[] getBytes()/getBytes(String enc) :根据默认/相应字符集转成字节数组\rbyte[] getBytes(String enc):根据相应字符集转成字节数组\rint indexOf(int ch) /int indexOf(int ch,int fromIndex):返回字符在串中位置

int indexOf(Stringstr) /int indexOf(String str,int fromIndex) :返回字符串在串中位置\rint length() :长度\rstring replace(char oldChar, char newChar) :替换字符\rString substring(int beginIndex) /substring(int beginIndex,int endIndex) :截取某段\rchar[] toCharArray() :转为字符数组\rString toLowerCase()/toUpperCase() :转小写/大写\rString trim():去掉两边空格\rstatic String valueOf(各种类型):将各种类型转为字符串

字符串处理(二):String

字符串处理(一):StringBuffer

StringBuffer:处理可变的字符串(相关函数作了同步处理)\rStringBuffer append(各种类型):在末尾添加字符\rStringBuffer insert(int offset, 各种类型):在其中添加字符\rStringBuffer delete(int start,int end) /deleteCharAt(int index) :删除字符\rint length() 包含的字符数

int capacity() :剩余容量\rchar charAt(int index) :返回某位置的字符\rvoid getChars(int srcBegin,int srcEnd, char[] dst,int dstBegin):得到一段字符\rStringBuffer reverse() :反转\rvoid setCharAt(int index, char ch):替换某个位置的字符\rString toString() :转为字符串

字符串处理(二):StringBuffer

时间管理

java.util.TimeZone:管理时区

static TimeZone getTimeZone(String ID) :根据ID得到时区\r static String[] getAvailableIDs() :得到系统支持的时区ID\r abstract boolean useDaylightTime() :该时区是否支持夏令时

java.util.Calendar:日历

static Calendar getInstance()/getInstance(TimeZonezone)\r 得到日历对象\r int get(int field) :得到日期内的某个值,参数为静态变量

java.util.Date:管理时间

第11节

随机数\r集合\r定时器

随机数:Random

常用方法:nextInt(n)\r生成某个范围内的随机数

集合

一维集合:java.util.Vector: 可以添加,删除,修改,获得对象\r二维集合:java.util.Hashtable: 利用key=value的形式进行数据存储,可以添加,删除,修改,获得对象

定时器

要让某个组件每隔一段时间做一件事情,如果觉得线程方法比较麻烦,可以用定时器\r要点:

定义一个类,继承TimerTask,重写run方法\r 定义一个Timer\r void schedule(Timer Tasktask, Date time) :某时刻触发\r void schedule(Timer Tasktask, DatefirstTime, long period):\r 某个时刻开始执行,指定重复执行的周期,单位是毫秒\r void schedule(Timer Tasktask, long delay) :某段时间之后触发\r void schedule(TimerTasktask, long delay, long period),某段时间\r 之后触发开始执行

案例:做一个电子钟

灯光闪烁和震动功能

Display的flashBackLight函数\rDisplay的vibrate函数

第12节 画布开发(一):

Canvas绘图

画布:Canvas

画布属于低级界面\rCanvas的结构以及paint函数;showNotify,hideNotify函数\r设置画布全屏:\r setFullScreenMode(booleanmode) \r得到高度,宽度:\r getHeight,getWidth\r

在画布上绘制

设置绘图颜色:Graphics.setColor:\r 格式:0xRRGGBB或者传入数字\r设置划线样式:Graphics.setStrokeStyle\r SOLID:实线;DOTTED:虚线\r画直线:Graphics.drawLine\r画矩形/实心矩形:Graphics.drawRect/fillRect\r画圆角矩形/圆角实心矩形:Graphics.drawRoundRect/fillRoundRect\r画弧线/填充弧线:Graphics.drawArc/fillArc\r填充三角形:Graphics.fillTriangle\r强制重画:Graphics.repaint

在画布上绘制:字符串和图片

修改字体:Graphics.setFont()\r画字符串:Graphics.drawString()

确定定位点: LEFT,HCENTER,\r RIGHT | BOTTOM,TOP,BASELINE\r 通过font来得知字符串所占的宽度\r 例如:将字画在屏幕正中心

画图片

Graphics.drawImage\r Graphics.drawRegion

第13节 画布开发(二)

按键\r指针事件

按键事件

相应函数

protected void keyPressed(int keyCode) :按下某个键\r protected void keyReleased(int keyCode) :释放某个键\r protected void keyRepeated(int keyCode):一直按某个键

键的代码由常量决定\r特殊键被认为是游戏键,需要转为游戏键才能进行判断

getGameAction(keyCode)\r getKeyCode(action)

案例

用上下左右键控制图片运动,并且体验重画技术\r 如果要考虑转动呢?

指针事件

利用hasPointerEvents和hasPointerMotionEvents方法判断是否支持指针\r相应函数

protected void pointerDragged(int x,int y) \r protected void pointerPressed(int x,int y) \r protected void pointerReleased(int x,int y)

第14节 案例

动画模拟

界面上有个小红球,要求能够慢慢掉下来然后弹起来\r额外要求:增加暂停和继续的功能

课后作业

界面上每秒钟在随机位置出现随机颜色的数字0-9,要求用户快速反应,按下按键,如果按对,加1分,错误减2分,不按减1分,初始5分,减到0分,提示用户输了

第15节 RMS编程(一):

基础知识

持久化存储的必要性

如果有游戏数据要存盘,怎么办?\r存入文件?但是有的手机不支持\rJ2ME中提供了记录管理系统:RMS,和数据库很类似\r相关的包:javax.microedition.rms\r怎么做?最重要的类:RecordStore\r注意:RMS是记录管理系统,类似数据库;RecordStore\r是记录集,类似表,表中有Record

RecordStore

常用打开记录集的方法\rstatic RecordStore openRecordStore(String recordStoreName,\r boolean createIfNecessary)\r 参数1:记录集名称(区分大小写);参数2:如果不存在,是否创建\rstatic RecordStore openRecordStore(String recordStoreName,\rboolean createIfNecessary,int authmode,boolean writable)\r 参数1:记录集名称;参数2:如果不存在,是否创建;参数3:创建\r 方式(AUTHMODE_ANY/PRIVATE),表示是否可以被其他套件创建访\r 问;参数4:其他套件是否可以进行写操作\r记录集占据的空间:int getSize() \r得到记录集名称:string getName() \r关闭记录集: closeRecordStore\r列出当前的所有记录集:RecordStore.listRecordStores();\r删除某个记录集:RecordStore.deleteRecordStore("name");

RecordStore记录操作

注意:每一个记录都有ID,第一个记录ID为1\r添加记录: int addRecord(byte[] data,int offset,int numBytes) \r 例如:将“张三”,”李四光”添加进RMS\r得到当前记录条数:int getNumRecords() \r根据ID获得记录: byte[] getRecord(int recordId)/int getRecord(int \r recordId, byte[] buffer,int offset)\r根据ID获得记录字节数:int getRecordSize(int recordId) \r修改记录: void setRecord(int recordId, byte[] newData,int offset,int \r numBytes)\r删除记录:void deleteRecord(int recordId) :注意,删掉一条记录之后,虽然记录数量减少了,但是记录还是保存在原来的位置,以后添加,ID在后面增加

将对象写入RMS

例如:定义Customer,包含姓名,电话号码,年龄,\r 要求存入RMS\r要点:

将对象转化为字节数组(序列化);\r 将字节数组转化为对象\r

第16节 RMS编程(二):

高级知识

遍历记录集

不能根据记录数量来遍历,因为记录被删除后,其他记录并不会填充空缺,记录数量虽然减少,但是ID数量不变\r方法1: \r enumerateRecords(RecordFilterfilter,\r RecordComparator comparator,boolean keepUpdated) ,参数1:过滤条件,参数2:比较规则,参数3:是否和记录集保持更新\r方法2:\r getNextRecordID:得到下一个将要添加的记录的ID,然后用for循环,并判断记录是否为空

记录监听

void recordAdded(RecordStore recordStore,int recordId) :记录添加时自动触发\rvoid recordChanged(RecordStore recordStore,int recordId):纪录修改时自动触发\rvoid recordDeleted(RecordStore recordStore,int recordId) :记录删除时,自动触发\rRecordStore addRecordListener(RecordListenerlistener) 负责绑定

数据过滤

RecordFilter接口\r定义一个类,实现这个接口\r重写match函数,根据情况返回true或者false\r用枚举方法来遍历时,将类的对象传进去\r案例:查询姓王的资料\r

数据排序

RecordComparator接口\r定义一个类,实现这个接口\r重写compare函数,根据情况返回:

RecordComparator.PRECEDES:记录1在记录2前面\r RecordComparator.FOLLOWS:记录1在记录2后面\r RecordComparator.EQUIVALENT:记录1=记录2\r

用枚举方法来遍历时,将类的对象传进去\r案例:查询大于100的资料并按照升序排列

几个问题

可以修改MF或者JAD文件中的MIDlet-Data-Size属性来改变RMS的最小存储字节数,首选JAD\r文件路径在WTK上面在:用户名称\j2mewtk\2.5.2\appdb\temp.DefaultColorPhoneXX下面的db文件\r一个记录集内的容量有限,约100K,如果数据太大,考虑用多个记录集

第17节 案例

模拟电话本

模拟电话本

界面出现,显示一个欢迎界面,右下角按钮:电话本;左下角按钮:退出\r按电话本按钮,显示电话本界面,用List显示所有电话;界面上左下角:返回;右下角两个按钮:添加电话,删除电话。\r按删除电话,删掉当前电话;按添加电话,进入添加电话界面,输入姓名和电话,确定,可以添加,添加完毕,进入电话本界面;该界面左下角的返回按钮供返回

文件结构

第18节 网络编程(一)

Socket编程

Socket是什么

如果你要开发一个聊天室程序,你要考虑什么问题?\rSocket是套接字,基于TCP协议的传输支持Socket

开发流程

服务器监听某个端口\r客户端连接服务器的某个端口\r通过SocketConnection通信

服务器监听某个端口

javax.microedition.io.ServerSocketConnection\rjavax.microedition.io.Connector专门负责建立各种连接\r open(“socket://:端口”),返回ServerSocketConnection\rServerSocketConnection可以获得服务器IP和端口\r如果有客户连上来,可以用ServerSocketConnection. acceptAndOpen()返回SocketConnection

客户端连接服务器端

javax.microedition.io.Connector专门负责建立各种连接

open(“socket://IP地址:端口”),返回SocketConnection\r案例:客户端连上服务器端,服务器端显示该客户信息

SocketConnection 重要方法:

getAddress() :得到客户端地址\rsetSocketOption: 设置一些参数,一般可以用默认\ropenDataInputStream/ openInputStream:打开输入流\ropenDataOutputStream/ openOutputStream:打开输出流

案例:客户端连上服务器,能够送给服务器端一个:你好;服务器端也能够送给客户端:欢迎连接服务器

通信过程

更加复杂的例子

客户端和服务器端连接,当客户端连上之后,能够和服务器端聊天.两端都有一个文本框输入聊天信息,点击“发送”,能够在另一端收取之后显示。注意,一切都是自动的,所以要用到多线程\r

第19节 案例

聊天室开发

回顾前面的知识点:单聊

客户端和服务器端连接,当客户端连上之后,能够和服务器端聊天.两端都有一个文本框输入聊天信息,点击“发送”,能够在另一端收取之后显示。注意,一切都是自动的,所以要用到多线程

多个客户端连接到服务器

服务器运行,多个客户端都能够连接到服务器,当连上时,服务器送给客户端一条信息:欢迎您的到来\r

多客户端连服务器,消息在服务器端显示

服务器运行,多个客户端都能够连接到服务器,注意,客户端还可以输入昵称。当连上时,服务器送给客户端一条信息:欢迎XXX(昵称)的到来\r客户端能给服务器端发信息,信息显示在服务器端,显示为XXX说:????

群聊

服务器运行,多个客户端都能够连接到服务器,注意,客户端还可以输入昵称。当连上时,服务器显示连上的人的昵称\r客户端能给服务器端发信息,信息显示在各个客户端\r思考题:研究一下SocketConnetion的关闭怎样写?参考J2SE的一些相应的内容

单聊

服务器运行,多个客户端都能够连接到服务器,注意,客户端还可以输入昵称。\r当连上时,客户端显示连上的人的昵称。\r客户端能给服务器端发信息,发信息时,选定某个人,发送,信息只会发给那个人。

第20节 网络编程(二)

UDP编程

UDP是什么

UDP是数据报,只负责传输信息,并不能保证信息一定会被收到,TCP基于连接,UDP基于报文,具体大家可以参考计算机网络\r

开发流程:

服务器监听某个端口\r客户端连接服务器的某个端口\r通过Datagram通信

服务器监听某个端口

javax.microedition.io. UDPDatagramConnection \rjavax.microedition.io.Connector专门负责建立各种连接\r open(“datagram://:端口”),返回UDPDatagramConnection \rUDPDatagramConnection可以获得服务器IP和端口\r

客户端连接服务器端

javax.microedition.io.Connector专门负责建立各种连接

open(“datagram://IP地址:端口”),返回\r UDPDatagramConnection\r案例:客户端连上服务器端,服务器端显示该客户信息

UDPDatagramConnection重要方法:

newDatagram()\rreceive()\rsend()

案例:客户端连上服务器,能够送给服务器端一个:你好;服务器端也能够送给客户端:欢迎连接服务器

更加复杂的例子

客户端和服务器端连接,当客户端连上之后,能够和服务器端聊天。两端都有一个文本框输入聊天信息,点击“发送”,能够在另一端收取之后显示。注意,一切都是自动的,所以要用到多线程

第21节 网络编程(三):

HTTP编程

案例

我们提交一个账号和密码给J2EE服务器,要求它能够查询数据库,能够返回我们是否登陆成功的信息\rHTTP是一种可以选用的方法

安装HTTP服务器

安装Tomcat: http://www.apache.org\r绑定JDK\r测试\r重要目录:bin; conf;webapps/root;\r修改端口\r具体可以参见J2EE资料\r

连接到HTTP服务器

javax.microedition.io.Connector专门负责建立各种连接

open(“http://IP地址:端口”),返回HttpConnection

HttpConnection重要方法:

int getResponseCode() \rString getResponseMessage() \rString getHost() / int getPort() / String getProtocol() /String getURL() \rString getQuery() \rString getRequestMethod() \rvoid setRequestMethod(String method) \ropenDataInputStream, openInputStream\ropenDataOutputStream, openOutputStream\r

案例

界面上有一个账号框,密码框,输入账号和密码,由HTTP服务器进行验证,在数据库中查询看是否含有这个用户。\r这里牵涉到JDBC,由于时间关系,我们将问题简化为以下情况:账号和密码相等时就认为登陆成功。

第22节 GameAPI(一)

游戏画布\r图层\r游戏精灵

简介

javax.microedition.lcdui.game 包,提高Java 游戏的性能\rGameCanvas:游戏画布,比普通画布更加适合游戏开发\rLayer:图层,可以表示画布上的某个可视的物体,是抽\r 象类\rSprite:可以充当游戏中的具体角色,一般用于运动角色,如子弹,汽车等\rTiledLayer:可以充当游戏中的具体角色,一般用于环境角色,如地图等\rLayerManager:管理图层的变换

GameCanvas

基本结构\r class MyGameCanvas extends GameCanvas implements Runnable{\r public MyGameCanvas(){\r super(true);\r }\r public void run(){\r }\r }\r构造函数传入参数,可以控制特殊键是否被禁用,为true时,可以通过getKeyStates查询状态,一般写法(getKeyStates