第三章 midp 入门
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 PresentationTRANSCRIPT
第三章 MIDP 入门第三章 MIDP 入门
2008-03
内容概述
• MIDP 相关名词解释• JAD 文件和 Manifest 文件详解• MIDlet 基本知识介绍• MIDlet 编程基础
电子科技大学科园培训机构
MIDP 名词
• MIDlet– 一个可以执行的应用程序基本单位。除了继承自
javax.microedition.midlet.MIDlet 之外还包括让此类可以顺利执行的所有其他类何资源文件。
• MIDlet Suite– 许多 MIDlet 所构成的集合,一般又叫做 MIDlet
应用程序套件。• JAR 文件( JAR File, .jar 文件)
– 包裹住 MIDlet Suite 的文件,属于 ZIP 压缩格式。
电子科技大学科园培训机构
MIDP 名词
• 描述文件( Descriptor File, .jad 文件)– 用来描述 MIDlet Suite 基本信息的文本文件,包
括 MIDlet Suite 所包含之 MIDlet 相关信息(类名称、图标、程序名)或是 MIDlet Suite 之整体信息(文件大小,安全权限,证书等),它独立于JAR 文件之外。
• 应用程序管理器( Java Application Manager )– 负责将 MIDlet Suite 安装到机器上执行以管理
MIDlet 生命周期的机制(或软件)总称。
电子科技大学科园培训机构
应用程序管理器
• 什么是应用程序管理器 ?– 应用程序管理器( Java Application Manager, JAM
)在规范中也称作 Application Management Software ( AMS )。这是一个用来执行 J2ME 应用程序的原生程序,应用程序管理器负责管理设备上所有的 J2ME 应用程序。
电子科技大学科园培训机构
应用程序管理器
• 后台工作– 用户不知道应用程序管理器的存在
电子科技大学科园培训机构
应用程序管理器
• 单一进入点– 用户必须先进入应用程序管理器,然后才能
启动个别的 Java 程序
电子科技大学科园培训机构
JAD 与 JAR
• MIDP 应用程序构成– 一个完整的 MIDP 应用程序是由一个 JAD 文件(
纯文本文件)与 JAR ( ZIP 压缩文件)所组成
描述文件( .jad )MIDlet-Jar-Url:xxx.jar
执行文件( xxx.jar )
电子科技大学科园培训机构
JAD 文件的必要性
• 这样设计的原因– 减少网络传输费用。用户先查看描述文件,再决
定要下载的内容。– 安全性。在描述文件中加入证书,证书中内含程
序制作单位的公钥。– 在 MIDP1.0 时 , 是否有 JAD 文件无关痛痒 . 但是在
MIDP2.0 之中 , 是否有 JAD 文件将涉及安全议题。
电子科技大学科园培训机构
JAD 与 JAR 的内容
电子科技大学科园培训机构
JAD 与 JAR 的内容
• JAD 的内容– 纯文本文件 , 内部是一些属性和属性值
• JAR 的内容– MIDlet– 相关的 Class 文件– 资源文件
• MIDlet 执行时所需要的文件 , 如图片、文本文件等– 清单文件 (Manifest File, Manifest.mf)
• 用来描述一个 MIDP 应用程序的基本信息• 存在于 JAR 文件内部
电子科技大学科园培训机构
MIDP 执行环境• MIDP 执行环境泛指 MIDP 应用程序在执行时
期所能获得的资源:– CLDC 中所定义的类库– MIDP 中所定义的类库– 工具类:自定义类、标准 Optional Package 类、
厂商专属程序库,其他程序库。– 资源: MIDlet 只能存取来自同一个 JAR 文件之中
的所有非 class 文件。– 权限确认与连接外部资源。– 描述文件与清单文件的内容。– 平台的特性。
电子科技大学科园培训机构
功能与资源
• JAR 文件里的资源文件读取– java.lang.Class.getResourceAsStream()
• 描述文件或清单文件读取– javax.microedition.midlet.MIDlet.getAppProperty()
• 平台特性读取– java.lang.System.getProperty()
电子科技大学科园培训机构
权限确认与连接外部资源
• 权限确认– javax.microedition.midlet.MIDlet 类提供
checkPermission() 方法用于权限确认
• 连接外部资源– javax.microedition.midlet.MIDlet 类提供
platformRequest() 方法用于连接外部资源
电子科技大学科园培训机构
JAD 与 manifest 内含的属性
• MIDP 标准里预先定义的属性– MIDlet-Name
• MIDlet Suite 的名称– MIDlet-Version
• MIDlet Suite 的版本号– MIDlet-Vendor
• 提供此 MIDlet Suite 的厂商名称– MIDlet-Icon
• 此 MIDlet 的图标文件的文件名
电子科技大学科园培训机构
JAD 与 manifest 内含的属性
– MIDlet-Description• 描述此 MIDlet 的相关信息
– MIDlet-Info-URL• 描述此 MIDlet 更多相关信息的 URL 地址
– MIDlet<n>• 描述 MIDlet Suite 之中 MIDlet 的信息
– MIDlet-Jar-URL• 应用程序要下载代表 MIDlet Suite 的 JAR 文件时应该去
的 URL 地址
电子科技大学科园培训机构
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 之前,应用程序管理器必须显示给用户的确认文字
电子科技大学科园培训机构
JAD 与 manifest 内含的属性• 与系统相关的属性
– MIDlet-Jar-RSA-SHA1 • JAR 文件的数字签名
– MIDlet-Certificate-<n>-<m>• 验证 JAR 文件用的安全证明
– MIDlet-Permissions• 执行此 MIDlet Suite 必要的权限
– MIDlet-Permissions-Opt • 执行此 MIDlet Suite 次要的权限
电子科技大学科园培训机构
JAD 与 manifest 内含的属性
• 与 OTA 相关的属性– MIDlet-Install-Notify
• 应用程序管理器安装此 MIDlet Suite 之后,用来报告安装结果的 URL
– MIDlet-Delete-Notify• 应用程序管理器删除此 MIDlet Suite 之后,用来报告删除结果的 URL
电子科技大学科园培训机构
JAD 与 manifest 内含的属性
• 与 Push 机制相关的属性– MIDlet-Push-<n>
• 与 javax.microedition.io.PushRegistry 类有关
• 以上的属性 ,MIDlet都可以在执行时期通过javax.microedition.midlet.MIDlet.getAppProperty() 取得。
电子科技大学科园培训机构
Manifest 文件必要属性• Manifest 文件里所指定的属性至少要有
下列几项:– MIDlet-Name– MIDlet-Version– MIDlet-Vendor– MIDlet-<n>– MicroEdition-Profile– MicroEdition-Configuration
电子科技大学科园培训机构
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-”开头的属性
电子科技大学科园培训机构
JAD 文件必要属性
• JAD 文件里所指定的属性至少要下列几项:– MIDlet-Name– MIDlet-Version– IDlet-Vendor– MIDlet-Jar-URL– MIDlet-Jar-Size– 其他的为可选属性
电子科技大学科园培训机构
JAD 文件必要属性
– JAD 与 manifest 相同的必要属性:• MIDlet-Name• MIDlet-Version• MIDlet-Vendor• 如果清单文件中这三个参数和描述文件中的这三个参
数值不同,那么应用程序管理器将不会下载并安装该JAR 文件
电子科技大学科园培训机构
JAD 与 manifest 属性
– 执行时期提取 JAD 与 manifest 属性:• 不受信任的 MIDP Suite :先传回清单文件的属性值,
然后才是描述文件内的属性值。以描述文件的属性值为主
• 受信任的 MIDP Suite :先传回清单文件的属性值,然后才是描述文件内的属性值。如果有他们有相同的属性,其值一定要一样。取得的属性值以清单文件中所指定的为主
电子科技大学科园培训机构
MIDlet 资源共享
– 同一个 MIDlet Suite 里的 MIDlet 可以彼此共享资源和 Class 文件,但不同的 MIDlet Suite 里不行
电子科技大学科园培训机构
MIDP 基本程序结构
• MIDlet 必须继承自javax.microedition.midlet.MIDlet 类
Java.microedition.midlet.MIDlet
MIDlet 应用程序
电子科技大学园培训机构
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){}
}
电子科技大学科园培训机构
MIDlet 起始行为
MIDlet 进入运行状态 (Active)
Application Manager 调用 startApp() 取得代表屏幕的 Display 对象
设定显示在屏幕上的画面
Display.getDisplay(this)
display.setCurrent(Displayable 类的子类 )
电子科技大学科园培训机构
程序的关键部分
– 在构造函数中获得 display
• display = Display.getDisplay(this);
– 在 startApp() 中显示 Form
• Form f = new Form(“Hello World”);
• display.setCurrent(f);
电子科技大学科园培训机构
执行结果
• 结果显示
注意:我们不能在程序里 new出其他的 MIDlet ,并调用其生命周期的相关函数,这样做会引发SecurityException.
电子科技大学科园培训机构
示例代码
电子科技大学科园培训机构
输出结果
• 输出结果 打开程序
设备暂停(例如电话有来电)
关闭设备
startApp()很可能不光被调用一次而已,每次从停止状态重新回到运行状态的时候都会被应用程序管理器调用,所以只需要执行一次的初始化动作不宜放在 startApp() 中,请改用构造函数做初始化动作
startApp()很可能不光被调用一次而已,每次从停止状态重新回到运行状态的时候都会被应用程序管理器调用,所以只需要执行一次的初始化动作不宜放在 startApp() 中,请改用构造函数做初始化动作
电子科技大学科园培训机构
MIDlet 类 & 应用程序管理器
• MIDlet 类中定义了如下三个抽象方法,因此我们撰写的 MIDlet 必须实现它们:– startApp() 转至运作状态– pauseApp() 转至停止状态– destroyApp() 转至消灭状
• 应用程序管理器通过这三个抽象方法来控制 MIDlet的生命周期。
电子科技大学科园培训机构
MIDP 的生命周期
电子科技大学科园培训机构
状态变迁
• 状态改变–状态的改变是由应用程序管理器来执行的– 如果MIDlet 自己调用这些函数,不会造成状态的转换,只能当成一个单纯的函数调用而已
– 代码示例
电子科技大学科园培训机构
MIDlet 自我管理• MIDlet 可以软性改变自己状态
–改变方法 :调用相应状态改变函数–改变的决定权在于应用管理器 , 不保证一定可行
电子科技大学科园培训机构
两种状态改变方式比较
– 应用程序管理器主动要求停止• pauseApp()会被调用
– MIDlet 自身调用 notifyPaused()• pauseApp() 不会被调用
– 但两者都会让 MIDlet 进入停止状态– notifyDestroyed() 与 destroyApp() 同理
电子科技大学科园培训机构
随机数
• Java.util.Random 类可用于产生随机数(只能是 int 或 long 类型)
• 关键代码– Random rdm = new Random(seedvalue);
或:Random rdm = new Random();( 系统时间做为随机数种子 )Int iRdm = rdm.nextInt(); 范围是 int 数据类型( 32bit )
随机数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)
电子科技大学科园培训机构
随机数
– 如想设定随机数的范围是 -160——160:Int res = rdm.nextInt() % 160;
– 如果想设定随机数的范围是 0 —— 160:Int res = (rdm.nextInt() >>> 1) % 160
– 如果想设定随机数的范围是 -160 —— 0:Int res = (rdm.nextInt() | 0x80000000) % 160;
电子科技大学科园培训机构
执行时间的测量
• 时间测量工具函数– System.currentTimeMillis()–返回值: long
• 作用– 取得目前时间与 1970 年 1 月 1日零时 UTC 时间 (
协调世界时 ) 的差距• 平常的使用方法
– 程序开始和结束时调用此函数得到的返回值之差就是程序执行的时间
电子科技大学科园培训机构
日期处理
• TimeZone– TimeZone defaulttz = TimeZone.getDefault()
• 不能用 new 来产生– defaulttz.getID()
• 取得所使用的时区– defaulttz.useDaylightTime()
• 是否使用日光节约时间
电子科技大学科园培训机构
日期处理
– defaulttz.getRawOffset()• TimeZone使用的时区和 GMT 相差值
– TimeZone.getAvaliableIDs()• 静态方法,取得系统所支持的时区
电子科技大学科园培训机构
日期处理
• 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 类合用
电子科技大学科园培训机构
日期处理
• Calendar– Calendar Cal = Calendar.getInstance()
• 不能用 new产生Date now = new Date();Cal.setTime(now);System.out.println(cal);
电子科技大学科园培训机构
日期处理
– 可以使用 get 方法获得时间的某部分信息• Cal.get(Calendar.HOUR);• Cal.get(Calendar.MINUTE);• Cal.get(Calendar.MILLISECOND);• Cal.get(YEAR);• Cal.get(MONTH);
电子科技大学科园培训机构
Thread
• Thread 的两种建立方式– 继承 Thread 类,并实现 run() 方法–实现 Runnable 接口,并实现 run() 方法
• 启动线程–调用 Start() 方法
电子科技大学科园培训机构
Timer & TimerTask
• Timer–产生周期信号
• TimerTask– 与 Timer 连用以处理周期信号到达时所作的动作
。
电子科技大学科园培训机构
Timer & TimerTask
• 示例
通过 Timer 的 schedule()方法来设定特定时间或特定周期,并将它与某个TimerTask 联系
继承 TimerTask 类
实现 run() 方法
电子科技大学科园培训机构
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 信号响应事件的周期
电子科技大学科园培训机构
Timer & TimerTask
– 示例 • 离现在 5秒钟之后,每隔 4秒产生一个信号
电子科技大学科园培训机构
Timer & TimerTask
– 在 TimerTask子类中可以调用scheduleExecutionTime() 方法来获得系统当前时间,作用与 System.currentTimeMillis() 相同,但scheduledExecutionTime()比较不会浪费系统资源
– 如果不希望 Timer 再产生信号,可以使用 Timer的 cancel() 方法停止 Timer,调用 cancel() 之后, Timer就会和 TimerTask脱离关系。
– Timer 属于系统资源,每次 MIDlet离开之前,都应该使用 Timer 的 cancel() 方法来停止 Timer
电子科技大学科园培训机构
Collection
• 使用数组的缺点– 数组大小不能动态改变–搜索数组内的数据效率低
• Collection 是 java.util 包中一组类的总称– Enumeration 接口– HashTable– Stack– Vector
电子科技大学科园培训机构
Collection
• Vector– 构造函数 :Vector(int initialCapacity) initialCapacity 初始大小
–添加元素: vec.addElement(new Integer(3))
• Stack : vector 类的子类–添加元素: stc.Push(new Integer(3))– 删除元素: stc.Pop()
电子科技大学科园培训机构
Collection
• HashTable–优点:搜索时间快–缺点:占用额外空间–添加元素: ht.put(“3”, new Integer(3))
• 第一个参数是索引值• 第二个参数是数据元素
电子科技大学科园培训机构
Collection
• Enumeration– 作用:对 Collection 进行访问控制–初始化: Enumeration e = s.elements()– e.hasMoreElements() 判断是否遍历到 Collection末尾
– e.nextElement() 取得下一个 Collection元素
电子科技大学科园培训机构
谢谢!