第三章 midp 入门

58
第第第 MIDP 第第 2008-03

Upload: vidor

Post on 15-Jan-2016

212 views

Category:

Documents


0 download

DESCRIPTION

第三章 MIDP 入门. 2008-03. 内容概述. MIDP 相关名词解释 JAD 文件和 Manifest 文件详解 MIDlet 基本知识介绍 MIDlet 编程基础. MIDP 名词. MIDlet 一个可以执行的应用程序基本单位。除了继承自 javax.microedition.midlet.MIDlet 之外还包括让此类可以顺利执行的所有其他类何资源文件。 MIDlet Suite 许多 MIDlet 所构成的集合,一般又叫做 MIDlet 应用程序套件。 JAR 文件( JAR File, .jar 文件) - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第三章  MIDP 入门

第三章 MIDP 入门第三章 MIDP 入门

2008-03

Page 2: 第三章  MIDP 入门

内容概述

• MIDP 相关名词解释• JAD 文件和 Manifest 文件详解• MIDlet 基本知识介绍• MIDlet 编程基础

Page 3: 第三章  MIDP 入门

电子科技大学科园培训机构

MIDP 名词

• MIDlet– 一个可以执行的应用程序基本单位。除了继承自

javax.microedition.midlet.MIDlet 之外还包括让此类可以顺利执行的所有其他类何资源文件。

• MIDlet Suite– 许多 MIDlet 所构成的集合,一般又叫做 MIDlet

应用程序套件。• JAR 文件( JAR File, .jar 文件)

– 包裹住 MIDlet Suite 的文件,属于 ZIP 压缩格式。

Page 4: 第三章  MIDP 入门

电子科技大学科园培训机构

MIDP 名词

• 描述文件( Descriptor File, .jad 文件)– 用来描述 MIDlet Suite 基本信息的文本文件,包

括 MIDlet Suite 所包含之 MIDlet 相关信息(类名称、图标、程序名)或是 MIDlet Suite 之整体信息(文件大小,安全权限,证书等),它独立于JAR 文件之外。

• 应用程序管理器( Java Application Manager )– 负责将 MIDlet Suite 安装到机器上执行以管理

MIDlet 生命周期的机制(或软件)总称。

Page 5: 第三章  MIDP 入门

电子科技大学科园培训机构

应用程序管理器

• 什么是应用程序管理器 ?– 应用程序管理器( Java Application Manager, JAM

)在规范中也称作 Application Management Software ( AMS )。这是一个用来执行 J2ME 应用程序的原生程序,应用程序管理器负责管理设备上所有的 J2ME 应用程序。

Page 6: 第三章  MIDP 入门

电子科技大学科园培训机构

应用程序管理器

• 后台工作– 用户不知道应用程序管理器的存在

Page 7: 第三章  MIDP 入门

电子科技大学科园培训机构

应用程序管理器

• 单一进入点– 用户必须先进入应用程序管理器,然后才能

启动个别的 Java 程序

Page 8: 第三章  MIDP 入门

电子科技大学科园培训机构

JAD 与 JAR

• MIDP 应用程序构成– 一个完整的 MIDP 应用程序是由一个 JAD 文件(

纯文本文件)与 JAR ( ZIP 压缩文件)所组成

描述文件( .jad )MIDlet-Jar-Url:xxx.jar

执行文件( xxx.jar )

Page 9: 第三章  MIDP 入门

电子科技大学科园培训机构

JAD 文件的必要性

• 这样设计的原因– 减少网络传输费用。用户先查看描述文件,再决

定要下载的内容。– 安全性。在描述文件中加入证书,证书中内含程

序制作单位的公钥。– 在 MIDP1.0 时 , 是否有 JAD 文件无关痛痒 . 但是在

MIDP2.0 之中 , 是否有 JAD 文件将涉及安全议题。

Page 10: 第三章  MIDP 入门

电子科技大学科园培训机构

JAD 与 JAR 的内容

Page 11: 第三章  MIDP 入门

电子科技大学科园培训机构

JAD 与 JAR 的内容

• JAD 的内容– 纯文本文件 , 内部是一些属性和属性值

• JAR 的内容– MIDlet– 相关的 Class 文件– 资源文件

• MIDlet 执行时所需要的文件 , 如图片、文本文件等– 清单文件 (Manifest File, Manifest.mf)

• 用来描述一个 MIDP 应用程序的基本信息• 存在于 JAR 文件内部

Page 12: 第三章  MIDP 入门

电子科技大学科园培训机构

MIDP 执行环境• MIDP 执行环境泛指 MIDP 应用程序在执行时

期所能获得的资源:– CLDC 中所定义的类库– MIDP 中所定义的类库– 工具类:自定义类、标准 Optional Package 类、

厂商专属程序库,其他程序库。– 资源: MIDlet 只能存取来自同一个 JAR 文件之中

的所有非 class 文件。– 权限确认与连接外部资源。– 描述文件与清单文件的内容。– 平台的特性。

Page 13: 第三章  MIDP 入门

电子科技大学科园培训机构

功能与资源

• JAR 文件里的资源文件读取– java.lang.Class.getResourceAsStream()

• 描述文件或清单文件读取– javax.microedition.midlet.MIDlet.getAppProperty()

• 平台特性读取– java.lang.System.getProperty()

Page 14: 第三章  MIDP 入门

电子科技大学科园培训机构

权限确认与连接外部资源

• 权限确认– javax.microedition.midlet.MIDlet 类提供

checkPermission() 方法用于权限确认

• 连接外部资源– javax.microedition.midlet.MIDlet 类提供

platformRequest() 方法用于连接外部资源

Page 15: 第三章  MIDP 入门

电子科技大学科园培训机构

JAD 与 manifest 内含的属性

• MIDP 标准里预先定义的属性– MIDlet-Name

• MIDlet Suite 的名称– MIDlet-Version

• MIDlet Suite 的版本号– MIDlet-Vendor

• 提供此 MIDlet Suite 的厂商名称– MIDlet-Icon

• 此 MIDlet 的图标文件的文件名

Page 16: 第三章  MIDP 入门

电子科技大学科园培训机构

JAD 与 manifest 内含的属性

– MIDlet-Description• 描述此 MIDlet 的相关信息

– MIDlet-Info-URL• 描述此 MIDlet 更多相关信息的 URL 地址

– MIDlet<n>• 描述 MIDlet Suite 之中 MIDlet 的信息

– MIDlet-Jar-URL• 应用程序要下载代表 MIDlet Suite 的 JAR 文件时应该去

的 URL 地址

Page 17: 第三章  MIDP 入门

电子科技大学科园培训机构

JAD 与 manifest 内含的属性– MIDlet-Jar-Size

• 此 MIDlet Suite 的 JAR 文件的大小– MIDlet-Data-Size

• MIDlet 所需要的永久资料存储区– MicroEdition-Profile

• 执行此 MIDlet Suite 所需要的 profile 名称及版本– MicroEdition-Configuration

• 执行此 MIDlet Suite 所需的 Configuration 名称及版本– MIDlet-Delete-Confirm

• 删除此 MIDlet Suite 之前,应用程序管理器必须显示给用户的确认文字

Page 18: 第三章  MIDP 入门

电子科技大学科园培训机构

JAD 与 manifest 内含的属性• 与系统相关的属性

– MIDlet-Jar-RSA-SHA1 • JAR 文件的数字签名

– MIDlet-Certificate-<n>-<m>• 验证 JAR 文件用的安全证明

– MIDlet-Permissions• 执行此 MIDlet Suite 必要的权限

– MIDlet-Permissions-Opt • 执行此 MIDlet Suite 次要的权限

Page 19: 第三章  MIDP 入门

电子科技大学科园培训机构

JAD 与 manifest 内含的属性

• 与 OTA 相关的属性– MIDlet-Install-Notify

• 应用程序管理器安装此 MIDlet Suite 之后,用来报告安装结果的 URL

– MIDlet-Delete-Notify• 应用程序管理器删除此 MIDlet Suite 之后,用来报告删除结果的 URL

Page 20: 第三章  MIDP 入门

电子科技大学科园培训机构

JAD 与 manifest 内含的属性

• 与 Push 机制相关的属性– MIDlet-Push-<n>

• 与 javax.microedition.io.PushRegistry 类有关

• 以上的属性 ,MIDlet都可以在执行时期通过javax.microedition.midlet.MIDlet.getAppProperty() 取得。

Page 21: 第三章  MIDP 入门

电子科技大学科园培训机构

Manifest 文件必要属性• Manifest 文件里所指定的属性至少要有

下列几项:– MIDlet-Name– MIDlet-Version– MIDlet-Vendor– MIDlet-<n>– MicroEdition-Profile– MicroEdition-Configuration

Page 22: 第三章  MIDP 入门

电子科技大学科园培训机构

Manifest 文件可选属性– MIDlet-Description– MIDlet-Icon– MIDlet-Info-URL– MIDlet-Data-Size– MIDlet-Permissions– MIDlet-Permissions-Opt– MIDlet-Push-<n>– MIDlet-Install-Notify– MIDlet-Delete-Notify– MIDlet-Delete-Confirm– 其他不以”MIDlet-” 或”MicroEdition-”开头的属性

Page 23: 第三章  MIDP 入门

电子科技大学科园培训机构

JAD 文件必要属性

• JAD 文件里所指定的属性至少要下列几项:– MIDlet-Name– MIDlet-Version– IDlet-Vendor– MIDlet-Jar-URL– MIDlet-Jar-Size– 其他的为可选属性

Page 24: 第三章  MIDP 入门

电子科技大学科园培训机构

JAD 文件必要属性

– JAD 与 manifest 相同的必要属性:• MIDlet-Name• MIDlet-Version• MIDlet-Vendor• 如果清单文件中这三个参数和描述文件中的这三个参

数值不同,那么应用程序管理器将不会下载并安装该JAR 文件

Page 25: 第三章  MIDP 入门

电子科技大学科园培训机构

JAD 与 manifest 属性

– 执行时期提取 JAD 与 manifest 属性:• 不受信任的 MIDP Suite :先传回清单文件的属性值,

然后才是描述文件内的属性值。以描述文件的属性值为主

• 受信任的 MIDP Suite :先传回清单文件的属性值,然后才是描述文件内的属性值。如果有他们有相同的属性,其值一定要一样。取得的属性值以清单文件中所指定的为主

Page 26: 第三章  MIDP 入门

电子科技大学科园培训机构

MIDlet 资源共享

– 同一个 MIDlet Suite 里的 MIDlet 可以彼此共享资源和 Class 文件,但不同的 MIDlet Suite 里不行

Page 27: 第三章  MIDP 入门

电子科技大学科园培训机构

MIDP 基本程序结构

• MIDlet 必须继承自javax.microedition.midlet.MIDlet 类

Java.microedition.midlet.MIDlet

MIDlet 应用程序

Page 28: 第三章  MIDP 入门

电子科技大学园培训机构

MIDlet 程序的基本外观

• MIDlet 程序的基本外观– startApp()  转至运作状态

– pauseApp() 转至停止状态

– destroyApp()转至消灭状态

Import javax.microedition.midlet.MIDlet;public class TestMidlet extends MIDlet{

public TestMidlet(){

super();}protected void statApp(){}protected void pauseApp(){}protected void destroyApp(bollean arg0){}

}

Page 29: 第三章  MIDP 入门

电子科技大学科园培训机构

MIDlet 起始行为

MIDlet 进入运行状态 (Active)

Application Manager 调用 startApp() 取得代表屏幕的 Display 对象

设定显示在屏幕上的画面

Display.getDisplay(this)

display.setCurrent(Displayable 类的子类 )

Page 30: 第三章  MIDP 入门

电子科技大学科园培训机构

程序的关键部分

– 在构造函数中获得 display

• display = Display.getDisplay(this);

– 在 startApp() 中显示 Form

• Form f = new Form(“Hello World”);

• display.setCurrent(f);

Page 31: 第三章  MIDP 入门

电子科技大学科园培训机构

执行结果

• 结果显示

注意:我们不能在程序里 new出其他的 MIDlet ,并调用其生命周期的相关函数,这样做会引发SecurityException.

Page 32: 第三章  MIDP 入门

电子科技大学科园培训机构

示例代码

Page 33: 第三章  MIDP 入门

电子科技大学科园培训机构

输出结果

• 输出结果 打开程序

设备暂停(例如电话有来电)

关闭设备

  startApp()很可能不光被调用一次而已,每次从停止状态重新回到运行状态的时候都会被应用程序管理器调用,所以只需要执行一次的初始化动作不宜放在 startApp() 中,请改用构造函数做初始化动作

  startApp()很可能不光被调用一次而已,每次从停止状态重新回到运行状态的时候都会被应用程序管理器调用,所以只需要执行一次的初始化动作不宜放在 startApp() 中,请改用构造函数做初始化动作

Page 34: 第三章  MIDP 入门

电子科技大学科园培训机构

MIDlet 类 & 应用程序管理器

• MIDlet 类中定义了如下三个抽象方法,因此我们撰写的 MIDlet 必须实现它们:– startApp()  转至运作状态– pauseApp() 转至停止状态– destroyApp() 转至消灭状

• 应用程序管理器通过这三个抽象方法来控制 MIDlet的生命周期。

Page 35: 第三章  MIDP 入门

电子科技大学科园培训机构

MIDP 的生命周期

Page 36: 第三章  MIDP 入门

电子科技大学科园培训机构

状态变迁

• 状态改变–状态的改变是由应用程序管理器来执行的– 如果MIDlet 自己调用这些函数,不会造成状态的转换,只能当成一个单纯的函数调用而已

– 代码示例

Page 37: 第三章  MIDP 入门

电子科技大学科园培训机构

MIDlet 自我管理• MIDlet 可以软性改变自己状态

–改变方法 :调用相应状态改变函数–改变的决定权在于应用管理器 , 不保证一定可行

Page 38: 第三章  MIDP 入门

电子科技大学科园培训机构

两种状态改变方式比较

– 应用程序管理器主动要求停止• pauseApp()会被调用

– MIDlet 自身调用 notifyPaused()• pauseApp() 不会被调用

– 但两者都会让 MIDlet 进入停止状态– notifyDestroyed() 与 destroyApp() 同理

Page 39: 第三章  MIDP 入门

电子科技大学科园培训机构

随机数

• Java.util.Random 类可用于产生随机数(只能是 int 或 long 类型)

• 关键代码– Random rdm = new Random(seedvalue);

或:Random rdm = new Random();( 系统时间做为随机数种子 )Int iRdm = rdm.nextInt(); 范围是 int 数据类型( 32bit )

Page 40: 第三章  MIDP 入门

随机数Int iRdm = rdm.nextInt(); 范围是 [0,n)Long lRdm = rdm.nextLong(); 范围是 long 型数值范

围( 64bit )Double dRdm = nextDouble() :范围是 [0.0d, 1.0d)Float dRdm = nextFloat() :范围是 [0.0f, 1.0f)

Page 41: 第三章  MIDP 入门

电子科技大学科园培训机构

随机数

– 如想设定随机数的范围是 -160——160:Int res = rdm.nextInt() % 160;

– 如果想设定随机数的范围是 0 —— 160:Int res = (rdm.nextInt() >>> 1) % 160

– 如果想设定随机数的范围是 -160 —— 0:Int res = (rdm.nextInt() | 0x80000000) % 160;

Page 42: 第三章  MIDP 入门

电子科技大学科园培训机构

执行时间的测量

• 时间测量工具函数– System.currentTimeMillis()–返回值: long

• 作用– 取得目前时间与 1970 年 1 月 1日零时 UTC 时间 (

协调世界时 ) 的差距• 平常的使用方法

– 程序开始和结束时调用此函数得到的返回值之差就是程序执行的时间

Page 43: 第三章  MIDP 入门

电子科技大学科园培训机构

日期处理

• TimeZone– TimeZone defaulttz = TimeZone.getDefault()

• 不能用 new 来产生– defaulttz.getID()

• 取得所使用的时区– defaulttz.useDaylightTime()

• 是否使用日光节约时间

Page 44: 第三章  MIDP 入门

电子科技大学科园培训机构

日期处理

– defaulttz.getRawOffset()• TimeZone使用的时区和 GMT 相差值

– TimeZone.getAvaliableIDs()• 静态方法,取得系统所支持的时区

Page 45: 第三章  MIDP 入门

电子科技大学科园培训机构

日期处理

• Date– Date 类负责记录与 1970 年 1 月 1日零时 UTC 时

间 ( 协调世界时 ) 的差距– Date date = new Date(time)

• time : 与 1970 年 1 月 1日零时 UTC 时间的差距– 可以这样产生 date: Date date = new Date()

相当于 : Date date = new Date(System.currentTimeMillis());

–注意: Date 类本身仅存放时间差,如果要解析年月日以及时间那么必须要和 Calendar 类合用

Page 46: 第三章  MIDP 入门

电子科技大学科园培训机构

日期处理

• Calendar– Calendar Cal = Calendar.getInstance()

• 不能用 new产生Date now = new Date();Cal.setTime(now);System.out.println(cal);

Page 47: 第三章  MIDP 入门

电子科技大学科园培训机构

日期处理

– 可以使用 get 方法获得时间的某部分信息• Cal.get(Calendar.HOUR);• Cal.get(Calendar.MINUTE);• Cal.get(Calendar.MILLISECOND);• Cal.get(YEAR);• Cal.get(MONTH);

Page 48: 第三章  MIDP 入门

电子科技大学科园培训机构

Thread

• Thread 的两种建立方式– 继承 Thread 类,并实现 run() 方法–实现 Runnable 接口,并实现 run() 方法

• 启动线程–调用 Start() 方法

Page 49: 第三章  MIDP 入门

电子科技大学科园培训机构

Timer & TimerTask

• Timer–产生周期信号

• TimerTask– 与 Timer 连用以处理周期信号到达时所作的动作

Page 50: 第三章  MIDP 入门

电子科技大学科园培训机构

Timer & TimerTask

• 示例

通过 Timer 的 schedule()方法来设定特定时间或特定周期,并将它与某个TimerTask 联系

继承 TimerTask 类

实现 run() 方法

Page 51: 第三章  MIDP 入门

电子科技大学科园培训机构

Timer & TimerTask

• 两个参数的 Schedule() 方法– schedule(TimerTask task, long delay)

• task :与 timer 相关联的 TimerTask• delay : TimerTask首次开始的延迟时间

• 三个参数的 Schedule() 方法– schedule(TimerTask task, long delay, long period)

• task :与 timer 相关联的 TimerTask• delay : TimerTask首次开始的延迟时间• period :执行 TimerTask 信号响应事件的周期

Page 52: 第三章  MIDP 入门

电子科技大学科园培训机构

Timer & TimerTask

– 示例 • 离现在 5秒钟之后,每隔 4秒产生一个信号

Page 53: 第三章  MIDP 入门

电子科技大学科园培训机构

Timer & TimerTask

– 在 TimerTask子类中可以调用scheduleExecutionTime() 方法来获得系统当前时间,作用与 System.currentTimeMillis() 相同,但scheduledExecutionTime()比较不会浪费系统资源

– 如果不希望 Timer 再产生信号,可以使用 Timer的 cancel() 方法停止 Timer,调用 cancel() 之后, Timer就会和 TimerTask脱离关系。

– Timer 属于系统资源,每次 MIDlet离开之前,都应该使用 Timer 的 cancel() 方法来停止 Timer

Page 54: 第三章  MIDP 入门

电子科技大学科园培训机构

Collection

• 使用数组的缺点– 数组大小不能动态改变–搜索数组内的数据效率低

• Collection 是 java.util 包中一组类的总称– Enumeration 接口– HashTable– Stack– Vector

Page 55: 第三章  MIDP 入门

电子科技大学科园培训机构

Collection

• Vector– 构造函数 :Vector(int initialCapacity) initialCapacity 初始大小

–添加元素: vec.addElement(new Integer(3))

• Stack : vector 类的子类–添加元素: stc.Push(new Integer(3))– 删除元素: stc.Pop()

Page 56: 第三章  MIDP 入门

电子科技大学科园培训机构

Collection

• HashTable–优点:搜索时间快–缺点:占用额外空间–添加元素: ht.put(“3”, new Integer(3))

• 第一个参数是索引值• 第二个参数是数据元素

Page 57: 第三章  MIDP 入门

电子科技大学科园培训机构

Collection

• Enumeration– 作用:对 Collection 进行访问控制–初始化: Enumeration e = s.elements()– e.hasMoreElements() 判断是否遍历到 Collection末尾

– e.nextElement() 取得下一个 Collection元素

Page 58: 第三章  MIDP 入门

电子科技大学科园培训机构

谢谢!