??xml version="1.0" encoding="utf-8" standalone="yes"?>
Configuration
J2ME通过对Configuration的抽象来处理大量千差万别的移动设备硬件功能。J2ME configuration定义了特定设备可用的虚拟机和低APIQ同时提供相应的开发基。目前可用的Configuration有两U,它们是连接设备配|CDCQConnected Device ConfigurationQ和q接有限讑֤配置CLDCQConnected Limited Device ConfigurationQ?/p>
q接讑֤配置
CDC应用于相对内存量较大、更强处理器的移动设备。CDC规范采用了内存优化的虚拟机,也就是所谓的CVMQ通过它提供等同标准JVM的特性。按照Sun的文档说明, CDC针对新型PDA、智能通讯讑֤和机盒之类的高端设备。ؓ了能够受到CDC支持Q移动设备必至具备以下条Ӟ
用于CVM和Java API库的2 MB内存?
32位微处理器或者控制器?
可用|络q接Q最好是高带宽连接?
q结有限讑֤配置
CDC的要求有利于昂贵的移动电话、IR扫描仪或cM产品。CLDC则主要针寚w些更M、更便宜、不能满CDC要求的设备?/p>
CLDC采用了更d的虚拟机Q设计ؓ在较低内存环境下q行。这UJVM的参考实C是所谓的KVMQؓ什么要叫KVM呢?q是因ؓq种虚拟机的大小是以千字节度量的。CLDC 的设备需求如下:
最?60KB的内存,其中128KB用于KVM和运行时?br />
最?6?5-MHz处理?br />
有限的用L面功?br />
没有Q或者间歇的Q低带宽|络q接
׃受到严格的内存容量限ӞKVM因此~Z一些完整JVM所提供的特性,q就是说Q你可能得改变自q~程风格了。KVM在如此低内存要求下不得不在QҎ学计、反应和对finalizerscȝ支持{方面对性能折中。用CLDC的开发者在~译E序之后必须预先采用J2ME开发工具包所提供的一U检查工具对他们的源代码q行校验?/p>
profile
如果说配|ؓ应用E序提供了基Q那么profile则提供了应用E序的框架。profile定义了一整套J2ME应用E序可用的APIc而且专门针对l定配置创徏。Sun推出?U可用的参考J2ME profileQ基QFoundationQ和Ud信息讑֤profileMIDPQMobile information Device ProfileQ?/p>
基础profile主要用于CDC配置Q因而其虚拟机几乎等同于标准的虚拟机。这意味着Q用基profile的开发h员必访问完整实现的J2SEҎ集?/p>
MIDPq同功能较低的CLDC配置一道ؓ开发今天的Ud讑֤应用E序提供了你最可能用到的Javaq_。MIDP支持J2SEcd的有限子集而且为在CLDC配置上用定义了定制的用h口和输入/输出cR?/p>
~写一ơ到处可行?
兼容性如何呢QJ2SE应用E序能在J2MEq_上运行吗Q这些问题的{案主要取决于配|和profile的具体应用了。J2SE代码无须或者很修改即可采用CDC和基profileq行。然而,正如我们在这里所讨论的那P׃Lg受到限制QCLDC和MIDP profile只提供了很有限的功能集合。因此它J2SE应用E序不大可能在不加修改的情况下就q行在这cd^CQ除非它把自己限制在两种q_的API交集之内Q严重地限制了其功能Q。因为CIDC的要求对应了今天大多数手持设备的功能Q所以Q何J2SE应用软g想不l修改就q行在给定的讑֤上是值得怀疑的。你多半得修攚w要移植到J2ME的应用Y件。但也别紧张。从保住饭碗的角度看q未不是好事?/p>
众所周知QJ2MEE序都是从MIDletcd始执行,pȝ规定了MIDlet的生命周期。规定MIDletE序有三U状态:
1?暂停状?
2?q行状?
3?销毁状?
pȝ在执行MIDletE序Ӟ首先构造一个MIDletcd的对象,然后使程序进入到暂停状态,按照生命周期的规定,pȝ会自动调用MIDlet对象的startAppҎ使程序进入到q行状态,开始程序的执行。如果在创徏MIDlet对象的过E中Q或者是调用startApp的方法中发生了异常,则系l会自动调用MIDlet对象的destroyAppҎq行到销毁状态,也就是ɽE序退出?
所以生命周期中的第一个需要注意的地方是熟悉在以上状态{换过E中Q系l会自动调用的方法,然后在实际编写MIDletcȝ时候,在这些方法中书写合适的代码Q这样就可以在系l规定的状态{换时Q自动调用这些方法?
另外一个需要说明的状态是暂停状态,pȝ在程序运行过E中Q如果手机有来电Q则pȝ会自动的使MIDletE序q行到暂停状态,在进入到暂停状态以前,pȝ会自动调用MIDlet对象的pauseAppҎ。当电话接听完毕以后Q系l会自动?MIDletE序q行到运行状态,在进入到q行状态以前,pȝq会自动调用startAppҎ使系l进入到q行状态?
对于上面的内容做一个简单的ȝQ?
1?startAppҎ
在系l第一ơ运行的时候,pȝ会自动调用该Ҏ使系l进入到q行状态?
当系l从暂停状态切换到q行状态以前,pȝ也会自动调用该方法?
2?pauseAppҎ
当系l从q行状态切换到暂停状态以前,会自动调用该Ҏ?
3?destroyAppҎ
当系l发生异帔R出程序以前,会自动调用该Ҏ。该Ҏ有一个booleancd的参敎ͼ如果该参Cؓtrue则代表该Ҏ必须清理和释放资源,如果为false可以抛出一个MIDletStateChangeException异常来表明它不想立即退出?
熟悉了这几个Ҏ的用以后,可以实现很多实用的功能,下面介绍两个实际功能的实玎ͼ
1?实现来电话时暂停的功?
在实际的MIDlet~程中,必须实现手机来电时暂停程序的功能Q如果有U程Ӟq需要把U程停止掉,然后当电话结束以后,重新昄界面Qƈ重新启动U程?
startAppҎ的具体的实现代码框架如下Q?/p>
public void startApp() { //获得当前昄的界?/span> Displayable curr = display.getCurrent(); //判断是否是第一ơ运?/span> if (curr == null) { //昄W一个界面,例如logo界面 } else { //昄来电以前的界?/span> display.setCurrent(curr); //如果需要,q可以启动线E?/span> } }
如果游戏界面中有U程Q则需要在来电时暂停线E,而pauseApp在暂停以前会被系l调用,所以可以在pauseAppҎ中实现该功能。pauseAppҎ的实C码框架如下:
public void pauseApp() { //获得当前昄的界?/span> Displayable curr = display.getCurrent(); //判断是否是游戏界?/span> if (curr instanceof GameCanvas) { //停止U程 } }2?实现按挂机时清理的功?
熟悉MIDlet~程的h都知道,在程序运行过E中按挂机键Q可以MIDletE序退出,在低U用L面编E中Q可以在keyPressedҎ中捕莯事gQ但是却无法处理Q因为捕获以后,E序q接退Z?
如果游戏中有背景音乐{,则当按挂机键直接退出的时候,音乐q会存在Q这样就会造成很多的问题。但是按挂机键以后,在程序退Z前,pȝ会自动调用destroyAppҎQ所以可以把最后处理的代码攄在destroyAppҎ中?
下面接着来看一下另一l方法,来l熟悉MIDletcȝ使用Q?
1?notifyPaused
使程序进入暂停状?
2?notifyDestroyed
是程序进入到销毁状态?
以上两个Ҏ和上面的三个Ҏ不同Q上面的三个Ҏ是在状态切换过E中Q会自动被系l调用。而这两个Ҏ不会被系l自动调用,但是E序员在实际~程q程中可以手动调用这两个ҎQɽE序q入指定的状态?
比如如果惛_现程序退出的功能Q就只需要MIDletE序q入到销毁状态即可,也就是只需要手动调用notifyDestroyedҎ卛_?
上面是MIDletcM最主要的两l方法,下面分MIDP1.0和MIDP2.0来分别介l剩下的Ҏ的作用。首先看一下MIDP1.0中的两个ҎQ?
1?getAppProperty
获得jad文g和manifest文g中属性的|如果一个属性在以上两个文g中都包含Q则以jad文g中的属性gؓ准?
2?resumeRequest
pȝ通过调用该Y件来判断是否需要该MIDletq入q行状态。如果需要进入运行状态,则系l会自动调用startAppҎ?
在MIDP2.0中,MIDletcM新增了两个方法,下面介绍一下这两个Ҏ的作用,依次是:
1?checkPermission
该方法是MIDP2.0的安全许可机Ӟ在程序的实际使用q程中,可以通过该方法来查MIDlet是否允许特定的操作,例如联网、发送短信息{等?
如果不允许该操作则返?Q允许返?Q未定义则返?1?
2?platformRequest
使用该方法可以访问某些系l功能,例如通用的功能主要有两种
使系l打开览器访问某个特定的|址Q?
platformRequest(“http://wap.sina.com.cn”);
q个功能可以实现用来实现提示用户下蝲新的E序版本{功能?
使手机拨打特定的电话LQ?
paltformRequest(“tel:1860”);
则系l会自动利用手机来拨?860?