1.08k likes | 1.26k Views
MIDP 应用程序. 1 MIDP 复习. MIDP 概述. 移动信息设备配置文件 (Mobile Information Device Profile , MIDP) 是一个用于手机 /PDA 开发的简表( Profile )。 在 Java ME 平台下, MIDP 定义了一个标准的 Java API 集合 ,该集合以 CLDC 为基础,为第三方的面向移动信息设备(如移动电话、双向寻呼机和无线个人电脑记事本)的应用的开发提供了一个开放的标准环境。
E N D
1 MIDP复习 MIDP概述 • 移动信息设备配置文件(Mobile Information Device Profile,MIDP) 是一个用于手机/PDA开发的简表(Profile)。 • 在Java ME 平台下,MIDP定义了一个标准的 Java API 集合,该集合以CLDC为基础,为第三方的面向移动信息设备(如移动电话、双向寻呼机和无线个人电脑记事本)的应用的开发提供了一个开放的标准环境。 • 目前,与MIDP相关的有两个简表:在JSR-37中定义了 MIDP 1.0 标准、在JSR-118 中定义了 MIDP 2.0 标准。
MIDP1.0 • 功能: • 显示工具箱; • 提供用户输入方法; • 实现持久性数据存储(使用RMS); • 基于 HTTP 1.1 的网络(使用 CLDC的 通用连接框架)。 • 对于设备的最低要求为: • 显示:屏幕大小为96X54,显示深度为1位,长宽比近似为1:1; • 输入:一个或多个用户输入装置,包括单手键盘、双手键盘、触摸屏等; • 内存:128KB非易失性内存供MIDP组件使用,8KB非易失性内存供应用程序创建的持久存储数据使用,32KB易失性内存供Java运行时使用; • 网络:双向、无线、可能间歇的、带宽受限的网络。
MIDP2.0 • 功能: • 支持操作图像的像素。 • 提供了增强型的图形用户界面类 CustomItem,提高了高级界面类的表现力。 • 增加的Media 音频子系统填补了 MIDP 1.0 不支持声音播放的空白。 • 使用Push 注册机制和安全模型增强了对 MIDlet 的控制。 • 提供游戏开发包提高了游戏开发的效率。 • 增强了联网能力,可以支持 TCP/IP 甚至是 UDP 层的通信。 • 对于设备的最低要求为: • 显示:屏幕大小为96X54,显示深度为1位,长宽比近似为1:1; • 输入:一个或多个用户输入装置,包括单手键盘、双手键盘、触摸屏等; • 内存:256KB非易失性内存供MIDP组件使用,8KB非易失性内存供应用程序创建的持久存储数据使用,128KB易失性内存供Java运行时使用; • 网络:双向、无线、可能间歇的、带宽受限的网络; • 声音:具有播放各种音调的能力,不管是通过硬还是软件算法获得。
MIDP2.1 2006年5月正式发布的MIDP 2.1规范,是对MIDP2.0规范的补充,对MIDP2.0规范做了少量的补充,MIDP 2.1规范对设备的要求和MIDP2.0规范对设备的要求一致。 新特性: (1)支持Canvas的重复事件和图像的双缓冲。 (2)在manifest.mf文件和JAD文件中必须包含MIDlet-Permissions,以增强MIDlet程序的安全性。 (3)系统必须提供对ISO/IEC JPEG和JFIF格式文件的支持,并且支持载入深度为1、2、4、8、16和32位的PNG格式文件。 …………
MIDP软件要求 • 一个能够管理底层硬件(中断、异常等)的最小内核。 • 一个非易失性内存中进行读写的机制,以便满足记录管理系统API的持久存储的要求; • 对设备的无线网络的访问能力,以便支持网络API; • 计时机制,用于给被持久存储的记录加上时间戳,以及为Timer API提供基础; • 写入一个位映射图像显示的最小能力; • 捕获用户从一种或多种先前提到的输入设备中的输入的机制; • 管理设备的应用程序生命周期的机制。
2 MIDlet概述 MIDlet简介 • MIDlet是一个可以执行的应用程序基本单位。除了继承自javax.microedition. midlet.MIDlet外,还包括让此类可以顺利执行的所有其它类和资源文件(只要是非class文件都称做资源文件)所构成的集合。 • 所以Java ME的手机程序也可以叫做MIDlet程序。 Java ME程序执行的入口必须是MIDlet的子类。
MIDlet套件 • MIDlet套件(MIDlet Suite)是由许多MIDlet所构成的集合,一般又叫做MIDlet应用程序套件。 • MIDlet Suite和MIDlet的关系,就像Office与Word、Excel、PowerPoint、Access的关系。 • MIDlet Suite包含的文件: • 用于实现程序功能的一个或多个MIDlet; • 用于运行应用程序的JAR文件; • 用于描述JAR文件的清单文件MANIFEST.MF; • 用于描述应用程序的JAD文件 。
JAR文件 JAR文件中主要包括下面各种元素: (1)实现MIDlet的类文件; (2)MIDlet中用到的任何资源文件(包括图像、声音文件等); (3)关于JAR内容的一份JAR MANIFEST描述。
JAD文件 • Java 应用程序描述符(Java Application Descriptor, JAD) 文件包含 MIDlet 套件的标题信息,例如开发应用程序的公司、应用程序名称和大小。 • 在下载应用程序到设备之前,将先下载和读取描述符,然后再下载和读取包含 MIDP 应用程序的 JAR 文件。 • Java 应用程序描述符文件的扩展名为 .jad。
MIDlet配置文件 • test1.jad源代码 MIDlet-1: MIDlet1,,MIDlet1 MIDlet-Jar-Size: 2921 MIDlet-Jar-URL: test1.jar MIDlet-Name: test1 Midlet Suite MIDlet-Vendor: Midlet Suite Vendor MIDlet-Version: 1.0.0 MicroEdition-Configuration: CLDC-1.1 MicroEdition-Profile: MIDP-2.1
MIDlet配置文件 • MIDlet-Name:MIDlet Suite的名称; • MIDlet-Version: MIDlet Suite 的版本号,格式为主版本.次版本.微版本,例如0.0.0。版本号主要用于安装或升级; • MIDlet-Vendor:MIDlet Suite的提供商; • MIDlet-Jar-URL:下载该MIDlet Suite 的URL 地址。虽然这里可以使用绝对位置或相对位置,但还是建议用绝对位置; • MIDlet-Jar-Size:JAR 文件的大小,计算单位为字节。
JAD文件与JAR文件的关系 • MIDP规范规定,如果JAD描述文件及JAR manifest中三个必备属性有任何不同的话,KVM是不会安装该MIDlet Suite的。 • 在调用MIDlet.getAppProperty的时候:对于不可信任的MIDlet Suite,JAD描述文件的属性会覆盖JAR manifest中的属性。对于可信任的MIDlet Suite,两者必须相同。
MIDlet开发好之后,如果需要放在手机上面运行,就必须进行打包。打包方法为:右击项目节点,找到“J2ME” 菜单,可以选择“Create Package”来创建普通包,也可以选择“Create Obfuscated Package”来创建加密的包。 • 创建完毕,生成了一个包,如:test1.jar,对应的配置文件:test1.jad。 • 理论上讲,将deployed下面的两个文件拷贝到目标系统中就可以运行(手机)。
3.详解MIDlet结构 • javax.microedition.midlet包中,只包含一个类:MIDlet。 • MIDlet(Mobile Information Devices let)是手机上运行的JavaME应用程序,即移动信息设备小程序。理论上讲,手机应用程序都是MIDlet,所以在编写的过程中,为了让MIDlet有自己的功能,编写的程序应该继承javax.microedition.midlet.MIDlet。
MIDlet基本API • MIDlet类是一个抽象类,抽象类无法直接实例化,但可以继承它,并且重写里面的抽象函数。 • 在这个类里面有一些成员函数,其中有六个比较重要,分别是: • 三个抽象函数,必须被重写: • protected abstract void startApp() • protected abstract void pauseApp() • protected abstract void destroyApp(boolean unconditional) • 三个普通函数: • public final void notifyPaused() • public final void notifyDestroyed() • public final void resumeRequest()
MIDlet基本API • 这些函数体现了MIDlet的生命周期: • 当MIDlet运行时,startApp函数会自动调用,应用程序进入运行(Active)状态,此时程序正在运行中; • 在MIDlet运行时,可以通过一些手段让MIDlet暂停,此时,pauseApp函数自动调用,让程序进入暂停(Paused)状态; • 当MIDlet消亡时,自动调用destroyApp函数。 • 以上三个函数都是自动调用的。接下来的几个函数可以人为调用: • 人为调用notifyPaused函数,MIDlet立刻进入暂停(Paused)状态,MIDlet持有的所有资源暂时被释放,但它随时可能被运行; • 人为调用notifyDestroyed函数,MIDlet立刻进入销毁(Destroyed)状态,MIDlet被永久地关闭并且释放占用的所有资源,等待着废物清理程序的处理; • 人为调用resumeRequest函数,MIDlet立刻进入运行(Active)状态,并调用startApp函数。
MIDlet的生命周期 • MIDlet的生命周期
4.界面基本知识 • 界面分为高级界面和低级界面: • 高级界面:界面上的效果都是由控件组成的; • 低级界面:界面效果都是通过手工编程,在画布上画出来的。 • 高级界面中的控件有两种:能够充满整个界面的控件和不能充满整个界面的控件;其中,能够充满整个界面的控件都是都是javax.microedition.lcdui.Displayable的子类,不能充满整个界面的控件都是javax.microedition.lcdui.Item的子类。
打开文档,找到javax.microedition.lcdui包,这个包里面包含了制作界面的最基本的API。打开文档,找到javax.microedition.lcdui包,这个包里面包含了制作界面的最基本的API。 • Displayable的子类有两个:javax.microedition.lcdui.Canvas和javax.microedition.lcdui.Screen,其中前者用于低级界面开发中的画布,后者是对高级界面的支持。
Screen的子类有以下几个: • javax.microedition.lcdui.Alert:用于高级界面开发中的提示框; • javax.microedition.lcdui.Form:用于高级界面开发中的表单; • javax.microedition.lcdui.List:用于高级界面开发中的列表框; • javax.microedition.lcdui.TextBox:用于高级界面开发中的文本框。 • 可以任选一个类来充当界面控件。高级界面中最常见的是javax.microedition.lcdui.Form。
在了解Form之前,有几个重要规定需要理解一下: • MIDlet只是提供一个运行平台,上面的界面需要自己加上去来生成,如可以将Form加到MIDlet上。 • 用Display类可以将Form加到MIDlet上。 • 软键上方的菜单,是javax.microedition.lcdui.Command对象。Command不是Displayable的子类,不能充满整个界面。不过,Command虽然不能充满整个界面,但是可以依赖于Displayable,添加到Displayable上,因为Form是Displayable的子类,因此可以添加到Form上。
javax.microedition.lcdui.Displayable中有如下方法可以进行命令按钮的维护: • Displayable有这些功能,当然它的子类Form也有这些功能。因此,可以在Form上添加命令按钮对象。 1:添加命令按钮: public void addCommand(Command cmd) 2:移除命令按钮: public void removeCommand(Command cmd)
Command构造函数一共两个: • 其中,有三个参数: • label:字符串,表示按钮上的标题; • commandType:整型,表示按钮类型; • priority:按钮出现的优先级,为整数,数字越小,优先级越高,越出现在菜单中靠前的位置
添加命令按钮 • 按钮类型一共有八种,定义为javax.microedition.lcdui.Command中的静态变量,实际上是整型,将按钮分为八种,其目的是为了让程序员在不同按钮使用场合可以灵活设定,增加程序可读性。八种按钮及其使用场合如表所示:
添加命令按钮 • 应该注意,按钮类型只是提供了一个分类而已,不代表点击按钮会有相应的事件发生。如,点击了一个类型为Command.HELP的按钮,不代表能够出现在线帮助,如果需要出现在线帮助,其事件代码必须手工写。实际应用中,最常见的是Command.SCREEN(普通按钮)、Command.BACK(返回按钮)等,因为这些按钮在大量的场合中可能出现。
按钮排布规律 • 对于同一种按钮,如果优先级相同,则按照代码先后顺序添加到菜单中。关于其他情况下的按钮排布,有如下规律: • 1:不同种类的按钮,在WTK优先级排序依次是:Command.ITEM、Command.SCREEN、Command.OK、Command.HELP、Command.BACK、Command.EXIT、Command.CANCEL、Command.STOP。优先级高的按钮优先显示在菜单中靠前的位置。 • 2:Command.BACK、Command.CANCEL、 Command.EXIT、Command.STOP倾向于抢占左方。优先顺序: Command.BACK、 Command.EXIT、Command.CANCEL、Command. STOP。 • 3:同一种类的按钮,在构造函数内可以用参数3来确定优先级,数字越小越优先,越优先的显示在菜单中靠前的位置。 • 4:只是在WTK内满足这个规律,其他模拟器可能不相同,具体可以查询文档。
按钮事件 • Command添加到Form上之后,还不能实现任何功能,只有具有一定事件的命令按钮才有实际作用。 • 在JavaME中的事件,是利用监听机制进行实现的。
按钮事件 • 事件具体编写步骤如下: • 1:编写事件处理类,实现javax.microedition.lcdui.CommandListener; • 实现一个接口,需要将接口里面的函数进行重写。javax.microedition.lcdui.CommandListener有一个函数: • 此函数里面有两个参数: • 第一个参数是表示发出事件的Command按钮 • 第二个参数是表示发出事件的Diaplayable对象。
按钮事件 • 2:重写CommandListener里面的commandAction方法,编写事件响应代码; • 如下代码: • 表示将Command按钮所在的Displayable标题改为“按钮被选择”。 • 3:将事件源和事件响应对象绑定。事件处理类编写完之后,只是能够处理事件,并不能保证Command按钮被选择之后会触发事件,因此还需要将Command按钮和事件处理类(CommandListener)对象绑定。 public void commandAction(Command c,Displayable d){ d.setTitle("按钮被选择"); }
按钮事件 • 在JavaME中,由于Command是依附于Displayable的,因此,绑定的工作可以由Displayable完成。打开文档,找到javax.microedition.lcdui.Displayable,会发现有如下函数,将Displayable对象和CommandListener对象绑定:
上机习题一 • 在界面左方有一个“返回”按钮,在界面右方有一个菜单,包含3个按钮:“删除该号码”、“编辑该号码”和“退出程序”。选择右边的“删除该号码”、“编辑该号码”按钮,要求能够将按钮标题打印出来;选择右边的“退出程序”,要求退出该程序;选择左边的“返回”按钮,要求将Form标题改为:“返回”。例如,首先选择右边的“删除该号码”、“编辑该号码”按钮,然后选择左边的“返回”按钮,就得到如图的效果。
前面讲到,Displayable的子类可以充满整个界面。Displayable的子类中,Screen用来创建高级界面。前面讲到,Displayable的子类可以充满整个界面。Displayable的子类中,Screen用来创建高级界面。 • 使用常用的高级界面类创建高级界面。
List开发 • List用于开发能够充满整个界面的列表框。List在JavaME移动开发中应用较广,如图界面,就是一个List的例子: • 界面上出现一个列表框,该列表框中有4个选项:“删除该号码”、“向该号码发送短信”、“编辑该号码”和“将该号码设置为好友”;这个列表框可以进行多选,用户将光标定位到某一项,按下选择键,就可以进行选择。其中,第1项的字体为大号粗斜体;第4项有一个图片标记。
List类型 • List是列表框,是Displayable的子类,可以充满整个界面。因此,List添加到界面上的方法和Form完全相同。打开文档,找到javax.microedition.lcdui.List,构造函数有2个: • 1. • 第一个参数是给List一个标题,是字符串; • 第二个参数决定了List的类型,为静态变量定义的整数。
List类型 • 2. • 参数1和参数2的意义和前面一个构造函数相同。参数3是一个字符串数组,确定列表框内的选项;参数4是一个图片数组,确定列表框内各个选项前的图片。如果不要图片,则用null表示。
List类型 • 参数listType可以有3种选择,代表了List的3种类型,分别是: • List. EXCLUSIVE:互斥,表示只能选择一个选项,每个选项左边有一个单选按钮,将光标定位到该选项之后,必须按下选择键才能选择该选项。 • List. IMPLICIT:另一种互斥,光标定位到该选项,就表示该项被选择。 • List.MULTIPLE:多选,光标定位到某选项,按下选择键,该选项前面的方框会被打勾,如果光标定位在一个被打勾的选项,再次按下选择键,则选项前面方框内的勾会消失。
List类型 • 一般使用的是第一个构造函数。 • 如果使用第一个构造函数,列表框内的选项应该一项项添加。List可以通过如下函数来添加选项: • 第一个参数是项目的字符串内容,也就是选项标题; • 第二个参数是项目的图片对象,如果为null,表示不要图片。 • 选项添加之后,每个选项都有一个编号,从0开始。
字体 • 列表框的第一项字体为大号粗斜体,在List类中,有一个函数: • 通过这个函数可以设置某个项目的字体,参数1是选项的编号,参数2是字体对象。
字体 • 字体类javax.microedition.lcdui.Font,这个类没有构造函数。一般是通过它里面的静态函数来生成对象,Font类中有如下函数: • 参数1为整数,表示字体的类型,一般可以有如下选择:Font.FACE_SYSTEM;Font.FACE_MONOSPACE;Font. FACE_PROPORTIONAL。 • 参数2为字体风格,可以选择:Font.STYLE_PLAIN:普通风格;由Font.STYLE_BOLD(粗体)、Font. STYLE_ITALIC(斜体)和Font.STYLE_UNDERLINED(下划线)的组合,组合时风格之间用“|”隔开。 • 参数3为字体大小,可以选择:Font. SIZE_LARGE:大号字体;Font. SIZE_MEDIUM:中等字体;Font. SIZE_SMALL:小号字体。
字体 • 关于字体,还有几个重要函数,在Font文档中,可以看到: • 1:得到字符的高度: • 2:得到某字符的宽度: • 3:得到某字符串的宽度: • 这些函数在界面画图和字符排版中非常有用。
图片 • 列表框的第4项前有一个图片。在List中添加项目时,用到append函数,其中参数2是一个Image对象:
图片 • 图片类javax.microedition.lcdui.Image。没有构造函数,通过它里面的静态函数createImage来生成对象,这个函数有好几个版本,其中最常见的是: • 参数为文件路径。注意在项目的树型目录下面有一个res目录,可以将图片放在这里,这个目录就作为资源的根目录“/”,可以写绝对路径。
图片 • 关于图片,还有几个重要函数,在Image文档中,可以看到: • 1:得到图片的高度: • 2:得到图片的宽度:
List的功能 • 对于List内项目的维护,从List文档可以看到,List类内提供了很多方法。 • 单选列表框还有一种风格:List.IMPLICIT。当List的类型为List.IMPLICIT时,光标移动到某项,然后按下选择键,系统能够自动由List.SELECT_COMMAND发出命令。