-
关于midlet的生命周期
当midlet被应用程序管理器成功地初始化之后,就开始展开了它的生命周期。
基本上midlet有三个状态:停止状态(paused),激活状态(active)和消灭状态(destroyed)。
midlet的生命周期完全由应用程序管理器控制,只有当应用程序管理器认为midlet的状态必须改变时,才会调用相关函数。
midlet一开始一定是先进入停止状态,然后应用程序管理器再将他转换为激活状态,然后调用startapp()。
以激活状态来说,应用程序管理器先将midlet转换为激活状态,然后才调用startapp()。而应用程序管理器会先调用pauseapp()或destroyapp(),然后再将midlet转换为停止状态或消灭状态。这就是active没有被动式(字尾没有加ed),而paused和destroyed都是被动式(字尾加ed)的真正涵义。
如果midlet自己调用这些函数,通常不会发生错误,但是也不会造成状态的改变(midlet的生命周期完全由应用程序管理器控制),只能当成一个单纯的函数调用而已。
startapp()每次从停止状态重新回到激活状态的时候都会被应用程序管理器调用。所以只需要被初始化一次的动作就不适宜放在startapp()中,应该用构造函数做初始化动作。
除了由应用程序管理器来控制midlet的生命周期之外,midlet本身也可以软性的决定自己的状态,但是不是自己来改变自己的状态,而是midlet先调用相对应的请求状态改变函数(resumerequest()--请求激活,notifypaused()--通知停止,notifydestroyed()--通知消灭),这些函数会向应用程序管理器发出消息,请它来帮助改变状态,但是决定权在应用程序管理器,不保证一定可行。
由midlet自己调用请求状态改变函数与应用程序管理器要求改变状态,两者是不一样的。
以停止状态为例:应用程序管理器要求停止时,pasueapp()会调用,而midlet调用notifypaused()时,pauseapp()不会被调用,但是两者都会使midlet进入停止状态,所以再midlet自己调用notifypaused()时最好也先调用pauseapp()比较合适。同样的情况也发生在notifydestroyed()和destroyapp()。除非是系统强制关闭midlet,否则最好midlet先调用destroyapp(),再调用notifydestroyed(),请应用程序管理器帮我们将midlet转到消灭状态,最后结束midlet的运行。单单midlet自己调用destroyapp()是没用的。
从这里我们可以看出startapp(),pauseapp()以及destroyapp()并非控制midlet生命周期的函数,它们只是一个提供我们初始化资源释放资源的地方而已!