MIDlet应用程序的生命周期

转1:除了由应用程序管理员来控制MIDlet的生命周期之外,MIDlet本身也可以决定自己的状态,但不是自己改变状态,而是MIDlet先呼叫上述相对应的状态改变函数。这些函数会发出讯息通知应用程序管理员,请它来帮助改变MIDlet的状态,但是决定权在应用程序管理员,不保证一定可行。状态改变函数如图11所示:



图11 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生命周期的函数,它们只是一个提供初始化资源、释放资源的地方而已。

根据MIDP 规格书中所说,即使MIDlet处于停止状态,它仍然可以处理异步事件(Asynchronous Event),比方说Timer的事件或是其它回呼函数(Callback)。这将涉及到resumeRequest()的使用。resumeRequest()会将MIDlet从停止状态回到运作状态,并调用startApp()。由于当时MIDlet处于停止状态,所以必须依靠异步事件使MIDlet重新回到运作状态。

在一些范例程序中,我们常常只呼叫notifyDestroyed(),而没有呼叫destroyApp(),这是因为范例通常没有释放资源的需求,所以可以不用呼叫。但是如果是正规的程序,建议记得呼叫destroyApp(false)会比较好。 

转2:描述一个MIDlet的生命周期,MIDlet的生命周期完全由JAM控制,也就是说,当MIDlet要从一个状态变成另外一个状态时,JAM会调用对应的函数,如果状态转换时发生错误,那么JAM会丢出MIDletStateChangeException异常。
只有当JAM认为MIDlet的状态必须改变时,才会调用相关函数,这些函数调用成功之后,JAM才会改变MIDlet的状态。因此,如果MIDlet自己调用这些函数,并不会发生错误,但是也不会造成状态的转换,只是一个单纯的函数调用而已。
startApp()很可能不光只有被调用一次而已,而是每次从停止状态重新回到运行状态的时候都会被JAM调用。所以只需要被初始化一次的变量就不适合在startApp()之中被初始化,可以改用构造函数做初始化操作。
其实MIDlet自己本身也可以控制自己的状态,但是,不是自己改变自己的状态,而是先自己调用上述相对应的状态改变函数,然后发出信息通知JAM,让它来帮忙改变MIDlet的状态。
举例:
假设今天是MIDlet主动要将MIDlet的状态由运行状态变成停止状态,那么我们光是直接调用pauseApp()函数,只会运行pauseApp()中的代码而已,却不会改变MIDlet的状态,因此在调用pauseApp()之后,MIDlet要另外调用notifyPaused()以通知JAM,JAM收到通知后,才会让MIDlet进入停止状态。从这里我们可以看出startApp(),pauseApp(),destroyApp()并非控制MIDlet生命周期的函数,他们只是一个提供我们初始化资源、释放资源的地方而已
根据MIDP1.0规格中所说,即使MIDlet处于停止状态,但是它仍然可以处理异步事件,比方说Timer事件或是其他回调函数。
只要MIDlet进去了消灭状态,就无法再回头。但是根据规格,我们无法在MIDlet之中直接调用System.exit()或Runtime.exit()来结束程序运行,如果这样做的话会引发java.lang.SecurityException异常。MIDlet一定要自己先调用destroyApp(),然后再调用notifyDestroyd(),让JAM帮我们将MIDlet转换到消灭状态。
destroyApp()有个布尔值作为参数,根据MIDP规格,如果传入true,那么MIDlet不管如何应该无条件释放所有资源,然后让JAM结束MIDlet的运行。如果传入false,而MIDlet不希望结束运行,那么它可以抛出MIDletStateChangeException异常告知调用人:我还不想被消灭。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值