前面搞明白了怎样利用eclipse编写基本的midlet。对midlet的基本结构也有所了解。但 midlet 具体是怎样运行的?三个状态间又是怎样的转换的?这些疑问需要自己一点一点的去解开……
以前面的hellomidlet 程序为例,这次为了清楚程序的执行情况,加了几句println。具体代码如下:
import javax.microedition.midlet.midlet;import javax.microedition.midlet.midletstatechangeexception;import javax.microedition.lcdui.*;/* * 创建日期 2005-10-5 * * todo 要更改此生成的文件的模板,请转至 * 窗口 - 首选项 - java - 代码样式 - 代码模板 *//** * @author snail * * todo 要更改此生成的类型注释的模板,请转至 * 窗口 - 首选项 - java - 代码样式 - 代码模板 */public class hellomidlet extends midlet { private display display; private form form; /** * */ public hellomidlet() { // todo 自动生成构造函数存根 system.out.println("constructor"); display = display.getdisplay(this); } /* (非 javadoc) * @see javax.microedition.midlet.midlet#startapp() */ protected void startapp() throws midletstatechangeexception { // todo 自动生成方法存根 system.out.println("startapp called"); form = new form("hellomidlet"); form.append("welcome to j2me world!"); display.setcurrent(form); } /* (非 javadoc) * @see javax.microedition.midlet.midlet#pauseapp() */ protected void pauseapp() { // todo 自动生成方法存根 system.out.println("pauseapp called"); form = new form(""); } /* (非 javadoc) * @see javax.microedition.midlet.midlet#destroyapp(boolean) */ protected void destroyapp(boolean arg0) throws midletstatechangeexception { // todo 自动生成方法存根 system.out.println("destroyapp called:" + arg0); }}
仔细观察代码,我只是在构造方法体和三个方法内分别添加了标志。方便我们在运行的时候 了解程序具体的执行情况。运行程序,当模拟器出现欢迎界面时,仔细观察eclipse的控制台。我们看到 如下信息:
正在通过存储根 defaultcolorphone 来运行
constructorstartapp called
系统首先调用构造方法,构造完成后midlet是处于暂停状态,紧接着会很快的转换到活动状态,然后才调用startapp 方法。 现在的midlet 已经处于活动状态。但是应用程序管理器会因为某些情况要求程序暂停 ,比如手机突然来电 或者短消息 等。应用程序管理器为了节省更多的系统资源 ,会首先调用pauseapp方法释放一部分midlet非必须的资源,然后再转换到暂停状态。所以一般在pauseapp()方法内应该添加释放资源的必需代码。上面的pauseapp()方法内
form = new form("");
可以模拟将form所占的内存释放掉。wtk 模拟器可以模拟系统调用pauseapp()的情况。

当我们暂停时 看看控制台 ,果然已经打印出"pauseapp called" 。当处理完外部事件,我们返回midlet 时 系统将midlet暂停状态再次转换到活动状态,接着再调用startapp 方法恢复midlet 所需要的资源。程序中startapp()方法内
form = new form("hellomidlet");form.append("welcome to j2me world!");
可以重新将form的内容恢复。
看看控制台 再次打印出 "startapp called"。
我们看到startapp()方法在一个midlet中可能会多次调用。所以我们应该注意:midlet的初始化过程和主要执行过程 并不是要全部写在startapp()方法体内。那些只执行一次 并且在程序初始化时执行的初始化动作 ,应该放在构造方法内。仔细观察控制台信息,还应该注意的是,构造方法只是在最初初始化时被系统调用,而且只有无参的构造方法才能被系统自动调用。如果把form的初始化工作放在构造方法内进行,当midlet从暂停状态恢复到活动状态,重新调用startapp()方法时,form的内容就无法恢复了。
当我们强制关闭模拟器终止midlet时,控制台打印出如下信息:
destroyapp called:true execution completed.
此时 控制台打印的 是 true ,即传入 destroyapp(boolean arg0)的参数为true。这表示 系统无条件终止该程序,并释放一切占用的资源。如果为false ,midlet可以通过抛出一个midletstatechangeexception 异常来向系统发出请求 。此时就有可能使midlet 继续保持其当前状态。
另外midlet本身也可以主动要求状态转换。以活动状态-->暂停状态为例。midlet必须调用notifypaused()方法通知应用程序管理器 :我要暂停运行,然后由应用程序管理器根据情况对midlet做相应的转变。如果midlet只是调用pauseapp()方法,系统只会执行其中的代码 ,并不会进行状态转换。但是当midlet调用notifypaused()时 pauseapp()并不会被调用。最好是在调用notifypaused()之前先调用pauseapp()。同样手动关闭midlet时也一样 ,应该在调用notifydestroyed()方法之前先调用destroyapp()方法。这些情况都是非强制性的,所以在请求 转换到销毁状态时传入的参数 最好是 false。
现在看来,状态转换需要调用的startapp() pauseapp() destroyapp() 方法具体工作也只是提供初始化资源 、释放资源的地方。
到此为止,对midlet的执行情况和生命周期 也有了大概的了解。
闽公网安备 35060202000074号