- Java ME嵌入式程序设计
- 张家耀 何雪芳 宋梅主编
- 1233字
- 2020-08-27 11:16:34
1.4 MIDP应用程序——MIDlet
MIDlet是MIDP应用程序的基本执行单元,是Sun公司对MIDP上的应用程序的一个独特叫法,意思是“MIDP小应用程序”。它是为满足小型资源受限设备的特殊要求,由MIDP规范所定义的一种全新的应用程序模型。MIDlet与标准Java程序中的Applet小应用程序一样,必须运行在某特定的环境中,或者说,运行在作为容器的大应用程序中。这个大容器可以适应不同厂家、不同型号和多种功能的移动设备。然而这个容器的内部为MIDlet提供了一个统一的接口。程序的开发者只需要编写规范的MIDlet就可以了。
下面考察一个最简单的MIDlet应用程序(HelloChina程序),通过这个例子可以了解MIDlet程序的基本结构特征。
例1-1 在屏幕上显示“中国 你好!”。
源程序名:HelloChina·java
import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class HelloChina extends MIDlet implements CommandListener { private Display display; private Command exitCommand; private TextBox t; public HelloChina() { display = Display.getDisplay(this); exitCommand = new Command("Exit",Command.SCREEN,1); t = new TextBox("Hello","中国 你好!",256,TextField.ANY); t.addCommand(exitCommand); t.setCommandListener(this); } public void startApp() { display.setCurrent(t); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void commandAction(Command c,Displayable s) { if(c==exitCommand) { destroyApp(false); notifyDestroyed(); } } }
经过编译,在仿真器上的运行结果如图1-3所示。
图1-3 HelloChina运行结果
从这个简单程序可总结出如下MIDlet程序的基本特征。
(1)每一个MIDlet程序必须是javax·microedition·midlet·*包中MIDlet类的子类。
作为MIDP应用程序的MIDlet,它一定是MIDlet类的子类。这样,设备的应用管理软件才能对MIDlet进行管理和控制。在这个例子中,MIDlet应用程序HelloChina 类就是继承MIDlet 类而来的。
(2)每一个MIDlet可以有一个构造方法。
MIDP 应用程序模型规定,构造方法仅被系统调用一次,用来初始化一个 MIDlet 的状态。构造方法要执行的操作取决于程序的需要。通常,将所有要在启动时执行,且只执行一次的操作放在构造方法中。同时,应捕获在构造方法中可能出现的异常,并处理之。
(3)每一个MIDlet必须实现用于控制程序生命周期的三个抽象方法。
当 MIDlet 被初始化后就进入它的生命周期,该生命周期包含三个状态:激活态(Active)、暂停态(Paused)和销毁态(Destroyed),这三种状态的控制完全由应用程序管理器 JAM(Java Application Manager)来完成。当出现状态迁移时,JAM会自动调用MIDlet在本例中出现的三个抽象方法:startApp( )、pauseApp( )和destroyApp( ),如图1-4所示。需要注意状态迁移与方法调用的因果关系,状态迁移是因,方法调用是果。
图1-4 MIDlet状态迁移触发的方法调用
JAM加载MIDlet后,首先进行初始化的工作,将状态设置为暂停态。如果在初始化的过程中没有出现任何异常,那么MIDlet的状态转为激活态,否则将MIDlet的状态设置为销毁态。在每次状态转换的时候都要调用相应的方法。
为此,在定义MIDlet类时需要实现这些状态转移时调用的方法,从而完成自定义的过程。一般,在startApp方法中定义程序运行时用到的资源,在pauseApp方法中释放暂时不使用的资源(避免因为状态切换使得系统资源被占用),在destroyApp方法中释放所有自己定义的资源。
在任何时刻,JAM都可能改变MIDlet的状态,为此这些方法有可能多次被调用,于是问题产生了。如果多次调用startApp方法就意味着多次定义资源,为此必须设计好一个资源定义的规划。一般来说,在startApp方法中定义那些临时性的资源,在pauseApp方法中释放,除startApp方法中定义的那些资源外,剩余的资源在MIDlet构造方法中定义。
(4)MIDlet 通常都会实现CommandListener接口。
CommandListener接口的实现是为了使应用程序对用户的操作做出反应。这个接口及TextBox、Command和Display类,都是javax·microedition·lcdui·*包的一部分。