MIDle生命周期详解,以及工作原理

简介: <p style="color:rgb(51,51,51)"> 当MIDlet被应用程序管理器成功地初始化之后,就开始展开了它的生命周期。MIDlet的生命周期完全由应用程序管理器控制,也就是说,当MIDlet要从一个状态变成另外一个状态时,应用程序管理器会调用对应的回调函数(call back,也就是MIDlet类定义的那三个抽象方法)。基本上,MIDlet有三种状态,分别是停止状态(P

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

目录
相关文章
|
5月前
|
JSON API UED
运营商二要素验证 API:核验身份的一致性技术实践(Python示例)
随着线上业务快速发展,远程身份核验需求激增。运营商二要素验证API通过对接三大运营商实名数据,实现姓名、手机号、身份证号的一致性校验,具备权威性高、实时性强的优势,广泛应用于金融、电商、政务等领域。该接口支持高并发、低延迟调用,结合Python示例可快速集成,有效提升身份认证的安全性与效率。
560 0
|
8月前
|
Kubernetes Cloud Native Serverless
OpenKruise v1.8版本解读:解锁云原生应用管理的无限可能
OpenKruise在2025年2月发布了最新的1.8版本。此版本带来了诸多重要的更新与增强,致力于进一步提升云原生应用管理的效率、弹性和可靠性。
|
安全 算法 区块链
量子计算:区块链安全的下一个重大威胁?
量子计算的飞速发展对依赖RSA和ECC加密的区块链安全构成潜在威胁。量子计算机的高效计算能力可破解传统加密,允许恶意攻击者篡改交易或盗取加密货币,影响经济安全。为应对这一威胁,研究人员正在开发抗量子加密算法,区块链平台也在考虑整合这些新算法以防御未来的量子攻击。尽管挑战重重,积极采取措施的区块链技术有望在量子时代保持安全可靠性。
|
人工智能 安全 搜索推荐
AI与能源管理:智能电网的未来
本文探讨了AI与智能电网的融合及其对能源管理的深远影响。智能电网利用先进的信息、通信和AI技术,实现电力的自主、智能化、高效管理。AI在精准预测电力需求、实时监测与故障诊断、智能能源调度、个性化能源服务和优化可再生能源利用等方面发挥关键作用,推动能源管理的高效、智能和可持续发展。
|
网络协议 应用服务中间件 nginx
Nginx配置server_name讲解
Nginx配置server_name讲解
1745 0
|
机器学习/深度学习 存储 监控
基于YOLOv8深度学习的遥感地理空间物体检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测(1)
基于YOLOv8深度学习的遥感地理空间物体检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测
【掰开揉碎】 uni-app 中的methods
【掰开揉碎】 uni-app 中的methods
453 1
四种解决”Arg list too long”参数列表过长的办法
这些方法都可以帮助你避免因参数列表过长而导致的错误。选择方法取决于具体情况和需求。
845 0
|
机器学习/深度学习 人工智能 达摩院
飞天 AI 平台重磅发布!阿里拥抱 AI 这五年
2014 年,一个名为“iDST”的神秘部门的诞生开启了阿里的人工智能新征程,5 年后,初长成的达摩院成为了阿里 AI 崛起的代表性力量。如今,阿里已跻身全球人工智能技术研发的第一梯队,成为时下这 AI 技术洪流中不可或缺的力量。这份出彩的“成绩单”背后,是阿里 AI 团队过去 5 年的筹谋、坚守与突破。在杭州召开的阿里巴巴云栖大会上,AI 悄然占据 C 位,新任“阿里云智能计算平台掌门人”贾扬清、阿里巴巴达摩院机器智能实验室负责人金榕、阿里巴巴达摩院语音实验室负责人鄢志杰等三十几位达摩院技术专家在大会第二天发布了阿里在 AI 领域的最新研究进展和成果。
3876 0
飞天 AI 平台重磅发布!阿里拥抱 AI 这五年
|
Android开发 Java C++
带你读《深入理解Android:Java虚拟机ART》之一:本书必读
本书将关注Android系统中至关重要的部分——Java虚拟机ART。随着Android设备的大规模普及,ART虚拟机已经成为当今使用最为广泛的JVM之一。所以,对ART虚拟机进行研究有着非同寻常的意义。本书的出现在一定程度上填补了这方面的空白。