MIDlet的生命周期
当MIDlet被应用程序管理器成功地初始化之后,就开始展开了它的生命周期。MIDlet的生命周期完全由应用程序管理器控制,也就是说,当MIDlet要从一个状态变成另外一个状态时,应用程序管理器会调用对应的回调函数(call back,也就是MIDlet类定义的那三个抽象方法)。基本上,MIDlet有三种状态,分别是停止状态(Paused)、激活状态(Active)以及消灭状态(Destroyed)。MIDlet一开始一定是先进入停止状态,然后应用程序管理器再将它转换成激活状态,然后调用startApp()。
请在心里树立一个概念,那就是:只有当应用程序管理器认为MIDlet的状态必须改变时,才会调用图中的相关函数。以Active状态来说,MIDlet先进入运作状态,然后才调用startApp()。而MIDlet会先调用pauseApp()或destroyApp(),然后再进入停止状态和消灭状态。这就是之所以Active没有被动式(字尾没有加ed),而Paused和Destroyed都是被动式(字尾加ed)的真正涵义。
如果MIDlet自己调用这些函数,通常不会发生错误(除非程序本身有逻辑上的错误),但是也不会造成状态的转换,只能当成一个单纯的函数调用而已。如果MIDlet在状态转换回调函数执行时发生错误,那么就应该抛出MIDletStateChangeException异常,让应用程序管理器知道该如何处理。
startApp()很可能不光只被调用一次而已,而是每次从停止状态重新回到运作状态的时候都会被应用程序管理器调用。所以只需要被初始化一次的动作就不适合放在startApp()之中,请改用构造函数做初始化动作。如果startApp()抛出MIDletStateChangeException或RuntimeException或两者的子类,那么会立刻进入消灭状态,而且系统会自动调用destroyApp(true)。
MIDP规范告诉我们,startApp()的执行时间应该尽可能的短。如果程序在执行时,发生的错误是可以过一阵子就解决的(很可能是系统资源暂时不足),那么程序员就该直接抛出MIDletStateChangeException,拦截之后,再调用notifyPaused(),稍待一会再经由异步事件调用resumeRequest(),重新试试看。如果发生错误即使稍待一会也无法解决,那么程序员就应该直接调用notifyDestroyed()来结束程序。
应用程序管理器会因为某些状况,必须请MIDlet停止运作,例如手机突然来电,或者闹铃响了,或者用户切换到其它程序执行,在这些情况下,为了避免MIDlet占用太多系统资源,所以应用程序管理器就会调用该MIDlet的pauseApp(),这时程序员应该在pauseApp()之中适时释放一些非必需的资源,等到往后回到运作状态时,应用程序管理器会重新调用startApp(),这时我们再将这些之前被pauseApp()释放的资源重新加载。
当MIDlet进入停止状态,不应该使用任何资源,如果应用程序管理器调用pauseApp()时产生异常情形,MIDlet就应该立刻进入消灭状态。
同样的情形也发生在destroyApp(),通常此方法被调用的时候,代表MIDlet要被关闭了,所以程序员应该在这里释放自己所分配的资源。只要MIDlet进入了消灭状态,就无法再回头。如果是系统自己调用destroyApp(),那么在destroyApp()执行时万一发生异常,这些异常将被忽略,MIDlet一样会被关闭。根据规范,我们不能在MIDlet之中直接调用System.exit()或Runtime.exit()来结束程序达到执行,如果这样做的话,会引发java.lang.SecurityException异常。
3 MIDlet自己管理自己的生命周期
除了由应用程序管理器来控制MIDlet的生命周期之外,MIDlet本身也可以软性地决定自己的状态,但不是自己改变自己的状态,而是MIDlet先调用上述相对应的状态改变函数,这些函数会发出信息通知应用程序管理器,请它来帮我们改变MIDlet的状态,但是决定权在于应用程序管理器,不保证一定可行。
假设今天是MIDlet主动要将MIDlet的状态由运作状态变成停止状态,那么我们直接调用pauseApp()函数,只会执行pauseApp()之中的程序代码而已,无法改变MIDlet的状态, MIDlet必须调用notifyPaused()以通知应用程序管理器,应用程序管理器收到通知之后,才会判断是否要让MIDlet进入停止状态。
由MIDlet调用notifyPaused(),与应用程序管理器主动要求停止,两者是有所差别的,主要在于应用程序管理器主动要求停止时,pauseApp()会被调用;由MIDlet调用notifyPaused()时,pauseApp()不会被调用。但是两者都会让MIDlet进入停止状态,所以在MIDlet自己动手调用notifyPaused()之前,最好自己也先调用pauseApp()比较合适。
同样的情况也发生在notifyDestroyed()与destroyApp()。除非是系统强制关闭MIDlet,否则最好MIDlet先调用destroyApp(),然后再调用notifyDestroyed(),请应用程序管理器帮我们将MIDlet转换到消灭状态,最后结束MIDlet的运作。单单MIDlet自己调用destroyApp()是没有用的。
destroyApp()有个布尔值作为参数,根据MIDP的规范,如果传入true,那么MIDlet不管如何应该无条件释放所有资源,然后让应用程序管理器结束MIDlet的运作,这属于系统或硬件强制关闭MIDlet的情形。如果用户调用notifyDestroyed()来结束MIDlet,那么在调用destroyApp()时,最好传入false,代表这并非系统或硬件强制关闭,这时如果MIDlet不希望结束执行,它可以通过抛出MIDletStateChangeException异常告知调用它的人:“我还不想被消灭”,请待会儿再试试。
从这里我们可以看出startApp()、pauseApp()以及destroyApp()并非控制MIDlet生命周期的函数,它们只是一个提供我们初始化资源、释放资源的地方而已。
分享到:
相关推荐
1. **MIDlet生命周期管理**:理解MIDlet的启动、暂停、恢复及关闭等状态转换机制,确保应用能够在各种场景下正常运行。 2. **资源访问**:了解如何在MIDlet中访问网络资源、本地文件系统等。 3. **用户界面设计**:...
#### MIDlet生命周期详解 1. **初始化**:当JAM加载MIDlet时,首先调用其无参构造函数进行初始化。 2. **启动**:初始化后,`startApp()`被调用来启动MIDlet。 3. **暂停**:当MIDlet进入后台或设备进入低功耗模式...
**第三章 CLDC编程概述** ...总结,CLDC编程涉及到理解CLDC的目标、架构、MIDlet生命周期以及CLDC与J2SE之间的差异。开发者需要熟练掌握这些知识,以便在资源受限的设备上创建高效、可靠的Java应用程序。
总结,“MIDletOne.rar”是一个生动的J2ME编程实例,它涵盖了J2ME的基础概念、开发环境、MIDlet生命周期、无线应用开发以及部署测试的关键环节。通过学习这个实例,开发者不仅可以掌握J2ME编程的基本技巧,还能了解...
6. **MIDlet生命周期管理**:MIDlet(Mobile Information Device Profile应用)在每次进入活动状态时需要调用`startApp()`方法。MIDlet的生命周期包括启动、暂停、停止和销毁四个阶段。 7. **MIDlet暂停状态**:当...
总结起来,《HelloMIDlet.rar_in》是一个学习和实践J2ME开发的起点,尤其是对于初学者,通过这个简单的MIDlet,可以理解J2ME平台的基本结构、MIDlet生命周期以及如何创建基本的用户交互。通过深入研究和扩展这个例子...
【J2ME基础知识点】 1. PDA全称为Personal Digital Assistant,中文译为个人...以上是对J2ME基础知识和进阶知识的详细解释,涵盖了PDA的特点、J2ME的架构、MIDlet生命周期、用户界面组件以及程序开发流程等多个方面。
`startApp()`、`pauseApp()`和`destroyApp()`是MIDlet生命周期中的关键方法,分别对应应用的启动、暂停和销毁状态。 3. **Display类** `Display`类用于管理设备的用户界面。`Display.getDisplay(this)`是获取当前...
MIDlet生命周期包括初始化、显示、暂停、恢复和终止几个阶段。开发者需要实现MIDlet接口,并覆盖其方法来管理应用程序的状态。 **02-1MIDlet基本结构(1).swf、02-2MIDlet基本结构(2).swf** 这两个SWF文件很可能是...
对于初学者,可以从基础的MIDlet生命周期开始学习,逐步掌握如何使用Canvas进行图形绘制,以及如何利用MIDP提供的API创建游戏逻辑和用户交互。随着技能的提升,可以尝试更复杂的项目,如多人在线游戏或3D游戏开发。
通过深入学习J2ME的体系结构、配置、简表和MIDlet生命周期,开发者能够创建出适应不同设备且具有吸引力的移动游戏。随着技术的进步,虽然新的平台和框架不断涌现,但J2ME的知识仍然是移动开发领域不可或缺的一部分。
开发者需要了解MIDlet生命周期,包括启动、暂停、恢复和停止等状态,以及如何处理用户的输入事件。 此外,J2ME的图形用户界面(GUI)通常基于Component和Container类,例如Form、ChoiceGroup和TextBox等,开发者...
**MIDlet生命周期** 每一个MIDlet都有一个特定的生命周期,包括初始化、启动、暂停、恢复和终止五个状态。在"HelloMIDlet.zip"里,你可以看到如何实现这些生命周期方法,比如`startApp()`、`pauseApp()`、`resumeApp...
总的来说,J2ME开发需要理解MIDlet生命周期,熟练使用IDE进行编码、测试和打包,并掌握模拟器的使用。通过不断实践和学习,开发者可以创建出功能丰富的移动应用。在资源有限的移动设备上,J2ME提供了强大的开发平台...
以上就是对这些考古题目的详细解答,涵盖了Java ME的MIDP、CLDC、Jad文件以及MIDlet生命周期管理等多个方面。对于准备SCJP(Sun Certified Programmer for the Java 2 Platform, Standard Edition)或SCWCD(Sun ...
总结,开发J2ME手机游戏,你需要理解游戏逻辑、EclipseMe插件的使用,以及MIDlet生命周期管理。通过项目教学法,你可以提升编程技能,同时掌握非矩形窗口和控件定位等进阶技巧。在实践中不断迭代和优化,将有助于你...
通过理解 J2ME 的基础知识,如 CLDC、MIDP 以及 MIDlet 的生命周期,开发者可以有效地创建出满足用户需求的移动应用程序。利用 WTK 等开发工具,可以简化开发过程并确保应用程序在不同设备上的兼容性。
### 数字小游戏 J2me:理解...它展示了如何利用Java ME的特性创建可运行于手机上的游戏应用,涉及到了MIDlet生命周期管理、Canvas图形绘制、事件监听和多线程处理等多个技术点,对于学习J2ME开发具有一定的参考价值。