MIDlet的 生命周期

转载 2007年10月12日 10:51:00
 转自:http://blog.csdn.net/zypsg/archive/2005/11/25/536986.aspx


前面搞明白了怎样利用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 来运行
Constructor
startApp 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的执行情况和生命周期 也有了大概的了解。

MIDlet工作原理

题记 :  现在的J2ME用户已经是日益减少 , 开发也在转型! 无奈之下也不得不写下这系列文章来别了j2me ,也是对过去的一些总结吧!         ①: 所有Kjava必须会继承自jav...
  • xiangzhihong8
  • xiangzhihong8
  • 2016年06月03日 16:26
  • 779

BroadcastReceiver生命周期探讨

前言之前做线控耳机连点两下切下一首歌的需求时, 曾经尝试在BroadcastReceiver中用一个成员变量保存最后一次按下的时间, 但后来发现这个值一直是初始值, 对它赋值后, 再次收到Intent...
  • oqqShaw123
  • oqqShaw123
  • 2015年09月10日 14:10
  • 2020

View的生命周期和Activity生命周期的执行顺序

前言了解了View的生命周期和Activity的生命周期能够让我们更好的理解View的工作原理。代码我们先写一个自定义View,然后打印出它的生命周期方法 public class MyTextVie...
  • Small_Lee
  • Small_Lee
  • 2017年06月28日 15:32
  • 350

Cocos2d-x场景生命周期函数介绍

层(Layer)的生命周期函数有如下:init()。初始化层调用。onEnter()。进入层时候调用。onEnterTransitionDidFinish()。进入层而且过渡动画结束时候调用。onEx...
  • tonny_guan
  • tonny_guan
  • 2014年06月01日 21:14
  • 5007

Fragment生命周期详解

Fragment生命周期详解1. Fragment概述Fragment从Android v3.0版本开始引入随着界面布局的复杂化,处理起来也更加的复杂,引入Fragment可以把activity拆分成...
  • Ash_Zheng
  • Ash_Zheng
  • 2016年05月14日 12:59
  • 13172

精通AngularJS(三)深入scope,继承结构,事件系统和生命周期

深入探讨 Scope 作用域 每一个 $scope 都是类 Scope 的一个实例。类 Scope 拥有可以控制 scope 生命周期的方法,提供事件传播的能力,并支持模板渲染。 作用域的层次结构...
  • Rongbo_J
  • Rongbo_J
  • 2016年03月20日 10:07
  • 2478

Java线程的生命周期

Java线程的生命周期作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs对于多线程编程而言,理解线程的生命周期非常重要,本文...
  • chszs
  • chszs
  • 2015年11月26日 16:53
  • 1860

Spring Bean生命周期详解

Spring Bean生命周期详解
  • a327369238
  • a327369238
  • 2016年08月12日 17:40
  • 7792

Android应用程序的生命周期

描述:程序的生命周期是在Android系统中进程从启动到终止的所有阶段,也就是Android从启动到停止的全过程。==程序的生命周期是由Android系统进行调度和控制的。 ① 程序生命周期 ...
  • G1036583997
  • G1036583997
  • 2014年03月07日 14:48
  • 8097

【Java TCP/IP Socket】深入剖析socket——TCP套接字的生命周期

转载请注明出处:    TCP连接的建立      新的Socket实例创建后,就立即能用于发送和接收数据。也就是说,当Socket实例返回时,它已经连接到了一个远程终端,并通过协议的底层实现完成了T...
  • mmc_maodun
  • mmc_maodun
  • 2013年11月17日 22:25
  • 8943
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MIDlet的 生命周期
举报原因:
原因补充:

(最多只允许输入30个字)