深入了解MIDP-基础篇⑶
>作者:Ding
Email:[email protected]
本文主要介绍MIDP的基本概念。因为注意到国内的java站点介绍J2me的还比较少
,所以就写了本文。如果有什么不妥的地方,欢迎您email我,讨论商榷。
如您要转贴,请保留原出处,并勿做删改。谢谢。
本文是j2me的基本介绍系列文章的后续,在基础篇中,将主要介绍MIDP的组织
结构,和MIDlet的LifeCycle,并通过一个实例,编写一个MIDlet程序。
=======================================================================
4.MIDlet的Lifecycle
在上一节里,我们已经成功编译并运行了一个简单的MIDlet程序。现在,让我
们来分析一下MIDlet的结构,和其Lifecycle。
通过对源程序的观察,我们可以发现MIDlet程序的运行是由startApp(),
pauseApp()和destroyApp()这3个方法控制的。它们在javax.microedition.midlet
.MIDlet中定义。所有的MIDlet都必须有这3个方法。顾名思义startApp()方法用于
标志一个MIDlet的开始执行。不过这里要注意一点,与HelloWorld程序的constrctor
不同。startApp()不光是在初始化完一个MIDlet时执行,只要该MIDLet被从Paused
态激活(变为Active态),startApp()就会被调用。pauseApp()方法标志着MIDlet
进入Pause态。而destroyApp()方法标志着MIDlet进入destroyed态。(注意:这里
严格的讲应该说成:方法被调用并成功返回标志着...)
看完上面的描述,大家可能会满头雾水,又是方法,又是状态的,什么跟什么
吗?这还得从MIDlet的执行机制讲起。MIDlet的执行是通过Application Management
software来管理的。这玩意儿是处在操作系统级别上来管理MIDlet运行的底层机制
的总称,所谓MIDlet state(MIDlet状态)就是它一手操办,控制管理的。MIDlet
state确保了AMS随时可以消灭该MIDlet,同时MIDlet也有办法进入一个Pause态,
并可再次激活。MIDlet State 分为Paused,Active,destroyed三种。当AMS创生
一个新的MIDlet实体时,对应于MIDlet,表现为其constructor被调用,进入Paused
状态。当所有的准备工作都做好后,AMS判断现在MIDlet可以运行了,于是调用
MIDlet.startApp()方法。进入Active态。当AMS决定要把MIDlet转入Paused态,就
会调用MIDlet.pauseApp()方法,MIDlet就会暂停执行,通常Paused态会用于释放
所占资源。当AMS判断MIDlet不再需要,就会调用MIDlet.destroyApp(),MIDlet被
消灭。请注意我上述是站在AMS的角度在谈AMS如何控制MIDlet的状态改变。程序员
也可请求MIDlet的状态的变换,通过调用resumeRequest,notifyPaused,notify
Destroyed这三个方法。
例如,我在上一节给出的例子中有如下程序片段:
...
public void commandAction(Command c,Displayable d){
if (c ==exitCommand){
destroyApp(false);
notifyDestroyed();
}
...
这里先把destroyApp()的unconditional值置为false,抛出一个MIDletStateChange
Exception 异常,表示MIDlet这时还不想被destroy。notityDestroyed()通知AMS
MIDlet进入destroyed态。具体的细节请参阅MIDP API文档。
下面给出一个最简单的MIDlet流程:
===========================FlowMIDlet.java================================
import javax.microedition.midlet.*;
public class FlowMIDlet extends MIDlet {
public void startApp() {
System.out.println( "In startApp..." );
pauseApp();
}
public void pauseApp() {
System.out.println( "In pauseApp..." );
destroyApp( true );
}
public void destroyApp( boolean unconditional) {
System.out.println( "In destroyApp..." );
}
}
===========================FlowMIDlet.java完===============================
关于MIDlet状态的改变可以用下图表示:
destoryApp()
+----------------------->--------------------------+
| |
new() +========+ startApp() +========+ destroyApp() +===========+
----->| Paused |------------->| Active |--------------->| Destroyed |
+========+ +========+ +===========+
| pauseApp() |
+---------<------------+
图1 MIDlet的状态转变
这里还要说几句闲话,关于AMS,其作用不止是控制MIDlet的运行状态。它实际上
际上负责了MIDlet的整个运行机制。关于AMS进一步的描述,请参见王森老师的文章-
利用Java撰写手机应用-Java Application Manager篇(《程序员》,12期,2001)
。注意其中JAM就是AMS。
===============待续==================