版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
GDDC游戏设计与开发课程GC03手机游戏设计与开发GDDC游戏设计与开发课程GDDC游戏设计与开发课程第十四章手机游戏开发基础GDDC游戏设计与开发课程PAGE22PAGE22PAGE21 PAGE21第十四章手机游戏开发基础MobileMediaAPI(MMAPI)为多媒体开发提供了一个强大,可扩充以及简单的接口。它有一套规范的播放和录制audio
或video的接口。MobileMediaAPI(MMAPI)为多媒体开发提供了一个强大,可扩充以及简单的接口。它有一套规范的播放和录制audio
或video的接口。另一方面,通过使用低级API,应该程序可以完全控制外观,而且可以直接访问输入设备并控制由用户交互产生的重要事件。但低级API可能是与某一固定设备相关的,即可能只在某一设备上可用。所以,使用低级API的应用程序在可移植性上会大打折扣的。这也是所有开发人员比较头疼的事,在某款手机上开发的游戏,在其他机型上就有可能运行不了,还得需要代码上的改动,而且这种代码上的改动有时会很大的,那么要求开发人员在做游戏的过程中,时刻注意游戏的可移植性问题。简单的说,高级API由于控制不了控件的外观,所以一般来说,高级API都用于手机上的应用或游戏当中的参数设置(如:游戏的关数、难易程度),相反,因为低级API可以随意在手机屏幕上画各种各样的内容,而且能够很方便地得到用户的输入(包括触摸方式),所以在游戏过程中,主要用的还是低级API。本章将讨论手机游戏开发用户界面的一些基础知识,而后两章将介绍使用高级API和低级API的UI开发。14.1MIDLET程序开发的基本方法编写源代码,生成.java文件。编译、预校验,生成.class文件。在模拟器上运行并测试。打包生成jar文件。下载到真机上测试。MIDlet程序开发的基本流程图一个player知道如何去解释媒体数据。某种类型的player知道如何根据mp3媒体数据产生声音。另外一个player知道如何播放一端QuickTime的movie。javax.microedition.media.Player接口的实现(implement)既是这里说的player。一个player知道如何去解释媒体数据。某种类型的player知道如何根据mp3媒体数据产生声音。另外一个player知道如何播放一端QuickTime的movie。javax.microedition.media.Player接口的实现(implement)既是这里说的player。在上一章节,我们通过一个简单的例子,介绍了MIDlet的生命周期,已经对MIDlet有了一个初步的认识,下面我们要系统地学习一下MIDlet。MIDlet类介绍一个MIDP应用程序称作MIDlet——MIDP小应用程序,它不能够单独地运行,必须运行在特定的环境之中,或者说运行在一个容器中。可以把这个容器看作是个大的应用程序,它运行在Java虚拟机之上,但不能完成任何特定的任务,因此需要程序开发者编写代码以完成一项工作,这些编写的程序就称作小应用程序。这样设计的目的是为了让它能在所有的容器中运行,这些容器实现可能不同,但容器的内部却是相同的。通过这种形式,程序开发者就从各种运行环境、各种设备中解放出来,只需设计一个MIDlet,就可以在不同的浏览器上运行。比如不同的厂家、不同型号的手机,只要它支持J2ME、支持MIDP,就有这样一个容器。至于这个容器的外部形状如何,程序开发者不必考虑,因为容器的内部都是一样的,只要编写规范的小应用程序就行了。MIDlet中这个容器就是MIDP实现,它以SUN公司发布的CLDC规范和MIDP规范为标准,然后针对设备进行移植,从而提供给所有的MIDlet都一样的容器内部接口。编写MIDP应用程序的要求就是必须扩展MIDlet类,这个类定义了一些接口,JAM可以通过这些接口对MIDlet进行控制。MIDlet类位于以下包中:java.microedtion.midlet,因此,在所有的MIDlet中,都必须引入这个包:importjavax.microedtion.midlet.*。注意:这里midlet表示包时必须小写,而MIDlet类的前三个字母大写。在本书中,称MIDP应用程序为MIDlet,可以表示整个应用程序,也可以只表示扩展了MIDlet类的子类,即MIDP应用程序的主类。midlet包介绍midlet包对MIDP应用程序进行了定义,也定义了应用程序和它所运行的环境之间的接口,如前面所述MIDP应用程序被称作MIDlet。midlet包中只有一个类——MIDlet,它是MIDP应用程序必须要扩展的父类,还有一个异常类——MIDletStateChangeException,它用来监测MIDP应用程序状态的改变。Midlet包整个层次结构如下:classjava.lang.Objectclassjavax.microedtion.midlet.MIDlet你能用一个或多个controls来调整player的行为。你可以在player从媒体转换数据的时候从一个player实例你能用一个或多个controls来调整player的行为。你可以在player从媒体转换数据的时候从一个player实例,取得并且使用controls。比如,你能用一个VolumeControl来调节一个采样音频的声音大小。Controls是javax.microedition.media.Control接口的实现。详细的Control子接口在javax.microedition.media.control包中classjava.lang.Exceptionclassjavax.microediton.midlet.MIDletStateChangeException扩展MIDlet类MIDlet是一个MIDP应用程序,应用程序必须扩展MIDlet类,这样才能使得应用管理器(JAM)对MIDlet进行控制,并能够从应用程序描述文件中获取属性,通知和请求状态改变等。由于MIDlet类位于包javax.microedtion.midlet中,因此第一步需要在代码程序中引入这个包:importjavax.microedtion.midlet.*;注意不要写成“importjavax.microedtion.MIDlet.*;接着需要扩展MIDlet类,它的类名就是要编写的主类名。扩展后的代码如下:importjavax.microedition.midlet.MIDlet;publicclassMyMIDletextendsMIDlet{}从java语法上说,这样一个空类是可以编译的,但实际上用eclipse试图编译的时候会拒绝通过,是因为有三个抽象方法是必须实现的,除非MIDlet子类也声明为抽象的:importjavax.microedition.midlet.MIDlet;publicabstractclassMyMIDletextendsMIDlet{}但是通常情况下,这种做法是没有意义的,应用程序需要直接扩展MIDlet类。构造函数一个datasource知道如何从它的原始位置读取到媒体数据给player。媒体数据可以被保存在不同的位置,从远程服务器到
资源文件或者RMS数据库。媒体数据可以从原始位置通过HTTP,像RTP一样的流式传输协议,或者其他机制传输到player。
tocol.DataSource是MMAPI中所有datasource类的抽象父类。一个datasource知道如何从它的原始位置读取到媒体数据给player。媒体数据可以被保存在不同的位置,从远程服务器到
资源文件或者RMS数据库。媒体数据可以从原始位置通过HTTP,像RTP一样的流式传输协议,或者其他机制传输到player。
tocol.DataSource是MMAPI中所有datasource类的抽象父类。这里先写个空的构建函数,在需要的时候可以往里面添加代码:importjavax.microedition.midlet.MIDlet;publicclassMyMIDletextendsMIDlet{ publicMyMIDlet(){ super(); }}类MyMIDlet之内构造函数之外的任何地方可以声明所需要的成员变量(为了程序结构的清晰,通常在紧靠声明的下面进行),比如声明一个原始数据类型(用来记录游戏中的分数),声明一个类对象,还可以在声明的时候初始化,这与J2SE编程是一样的,因为它们都遵守标准的Java语言规范。这里没有声明变量,在需要的时候可以自行添加进去。下面就要描述的是MIDlet类功能以及其API,只要实现了一些固定的API函数,java应用程序管理器才能对MIDlet进行管理和控制。MIDlet类功能介绍要满足java应用程序管理器的要求,必须实现下面三个方法:startApp()、pauseApp()、destroyApp(booleanunconditional),这三个方法分别被java应用程序管理器用来向MIDlet发出信号,通知它进入某个状态。实现后的代码如下:importjavax.microedition.midlet.MIDlet;importjavax.microedition.midlet.MIDletStateChangeException;publicclassMyMIDletextendsMIDlet{ publicMyMIDlet(){ super();可以支持那些类型的Media文件?如果你的装置支持MMAPI的话,那么这个装置可以播放什么类型的媒体数据呢?支持什么数据传输协议?MMAPI并不要求任何指定
的contenttype或协议,但你能在运行时找出程序支持什么类型的数据,通过调用Manager类的可以支持那些类型的Media文件?如果你的装置支持MMAPI的话,那么这个装置可以播放什么类型的媒体数据呢?支持什么数据传输协议?MMAPI并不要求任何指定
的contenttype或协议,但你能在运行时找出程序支持什么类型的数据,通过调用Manager类的getSupportedContentTypes()方法和getSupportedProtocols()方法。可能发生的最糟糕的事情是什么呢?如果你通过Manager给Player一种不支持的数据类型或协议,它会抛出个exception。
你的程序应该试图去从这样的例外中恢复过来,可以显示些礼貌的信息提示给用户。 protectedvoidstartApp()throwsMIDletStateChangeException{ } protectedvoidpauseApp(){ } protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{ }}这段代码就可以编译,表明它已经满足了java应用程序管理器的基本要求。是一个完整的MIDP应用程序。当然这只是一个MIDlet的框架,并没有完成任何工作。如果要完成所需的特定工作就,编写相应代码就行了,这个工作与在J2SE中没有什么差别。下面以MIDlet整个生存周期状态间转换为基础,详细描述MIDlet的方法和它们的调用机制。Active状态MIDlet进入的第一个状态不是Active状态而是Paused状态,只是这个状态比较短暂。在应用程序管理器中,用户可以单击软键Launch,通知应用程序管理器启动用户所选构造函数返回后,MIDlet就进入了Paused状态。此时应用程序管理软件会立即获得MIDlet的控制权,调用startApp方法。应用管理软件startApp方法来向MIDlet发出信号,通知它已经进入Active状态,在Active状态MIDlet可能拥有资源,只有在MIDlet处于Paused状态时才能调用这个方法。在Active状态MIDlet可以完成指定工作,因此程序开发以在这个函数中编写希望MIDlet执行的代码,比如调用自定义方法,或者其类对象例如下面的代码:importjavax.microedition.midlet.MIDlet;MIDP2.0的媒体:MIDP2.0规范包括了一个MMAPI的子集。它向上兼容所有API。MIDP2.0子集有如下特性:1。只支持音频回放(录制)。不包含video控制接口。2。多Player不能被同步3。DataSource类和tocol包的其他类没有被包括进来;应用程序不能实现他们自己的协议。4。Manager类是被简化的。MIDP要求支持乐音产生和采样,WAV音频播放。MIDP2.0的媒体:MIDP2.0规范包括了一个MMAPI的子集。它向上兼容所有API。MIDP2.0子集有如下特性:1。只支持音频回放(录制)。不包含video控制接口。2。多Player不能被同步3。DataSource类和tocol包的其他类没有被包括进来;应用程序不能实现他们自己的协议。4。Manager类是被简化的。MIDP要求支持乐音产生和采样,WAV音频播放。publicclassTestMIDletextendsMIDlet{ Stringmessage;//声明一个成员变量 publicTestMIDlet(){//在构建函数里进行初始化工作 super(); message=newString("I'minitiated,adninPausedstate."); showMsg(message); } protectedvoidstartApp()throwsMIDletStateChangeException{//在这里进行要完成的工作 message="I'minActivestatenow."; showMsg(message); } protectedvoidpauseApp(){ //TODOAuto-generatedmethodstub } protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{ //TODOAuto-generatedmethodstub } privatevoidshowMsg(Stringmsg){ System.out.println(msg);MotoJ2SDK是为摩托罗拉388手机定制的命令行开发工具包,当然也可与IDE开发工具集成从而方便用户的开发。其中可以集成的开发环境包括:CodeWarrior,JCreator等。另外SUN公司还提供了Java的开发工具,J2MEWirelessTookit是为无线手持设备(MDIP)定制的简易开发工具包。如果用户需要更强的IDE开发环境,那么请选用ForteforJavaCE。目前SUN公司提供的开发工具中暂时还没有388的模拟器。
Java2SDK1.3是必备的,它提供开发、测试和运行Java程序的平台MotoJ2SDK是为摩托罗拉388手机定制的命令行开发工具包,当然也可与IDE开发工具集成从而方便用户的开发。其中可以集成的开发环境包括:CodeWarrior,JCreator等。另外SUN公司还提供了Java的开发工具,J2MEWirelessTookit是为无线手持设备(MDIP)定制的简易开发工具包。如果用户需要更强的IDE开发环境,那么请选用ForteforJavaCE。目前SUN公司提供的开发工具中暂时还没有388的模拟器。
Java2SDK1.3是必备的,它提供开发、测试和运行Java程序的平台}在eclipse中编译并运行这个程序,控制台上会输出如下结果:I'minitiated,adninPausedstate.I'minActivestatenow.应用管理软件调用这个MIDlet,它会首先调用构造函数,然后再调用startApp,由于构造函数只运行一次,而startApp可能被应用管理软件调用多次,所以需要的初始化工作,应该在构造函数中进行,而不时放在startApp中。这个阶段会有两种错误会导致服务不能启动:—MIDletStateChangeException(如果MIDlet不能立即启动,但能够在以后启动时,则抛出这个异常,对于非瞬时错误,notifyDestroyd方法会被调用。如果在startApp期间发生运行时异常,MIDlet会立即销毁,destroyApp方法会被调用允许MIDlet进行清除工作。Paused状态MIDLET进入的第一个状态就是Paused状态,然后通过通用startApp方法进入Active状态。从Active状态进入Paused状态在Active状态下(并且只有这个状态下),应用程序管理以调用pauseApp方法向MIDlet发出信号,通知它暂停运行并进入Paused状态。在Paused状态,MIDlet必须释放共享资源并静止。如果pauseApp期间发生运行时异常,MIDlet将被立即销毁,此时会调用destroyApp方法,允许MIDlet进行清除工作。在Active状态下(并且只有这个状态下),MIDlet可以使用notifyPaused方法通知应用管理软件它不需要活动了,并进入Paused状态,如果MIDlet被销毁,或者还没有启动,调用这个方法将没有效果。从Paused状态进入Active状态在Paused状态下,应用程序管理软件可以调用startApp()方法,使它再次活动。moto手机开发的问题,moto手机开发的问题,四级灰度的颜色值怎么表示?
privatefinalstaticintWHITE_COLOR=0x00FFFFFF;
privatefinalstaticintLIGHT_GRAY=0x00888888;
privatefinalstaticintDARK_GRAY=0x00444444;
privatefinalstaticintBLACK_COLOR=0x00000000;
当调用resumeRequest()方法时,应用程序一般处于Paused状态。即使在Paused状态应用程序也可处理异步事件,如timer或回叫等。notifyPaused方法和resumeRequest方法被声明为final,在MIDlet子类中不能重载这个方法。继续修改TestMIDlet.java前面的代码,进行测试:importjavax.microedition.midlet.MIDlet;importjavax.microedition.midlet.MIDletStateChangeException;publicclassTestMIDletextendsMIDlet{ Stringmessage;//声明一个成员变量 booleanhasTested;//声明一个变量,代表是否测试过。 publicTestMIDlet(){//在构建函数里进行初始化工作 super(); message=newString("I'minitiated,adninPausedstate."); hasTested=false; showMsg(message); } protectedvoidstartApp()throwsMIDletStateChangeException{//在这里进行要完成的工作 message="I'minActivestatenow."; showMsg(message); if(!hasTested){ notifyPaused(); pauseApp(); } }moto手机开发的问题moto手机开发的问题,怎么样程序知道是运行在模拟器上还是在手机上
看IMEI号。一般手机按"*#06#"就可得到imei码,每个手机是唯一的。
publicvoidpaint(Graphicsg){
g.drawString("PhoneParameter:",0,0,16|4);
g.drawString("IMEI:",0,30,16|4);
g.drawString(System.getProperty("phone.imei"),0,60,16|4);
g.drawString("NetworkParameter:",0,90,16|4);
g.drawString("MCC:"+System.getProperty("phone.mcc"),0,120,16|4);
g.drawString("MNC:"+System.getProperty("phone.mnc"),0,150,16|4);
g.drawString("LAI:"+System.getProperty("phone.lai"),0,180,16|4);
g.drawString("CID:"+System.getProperty("phone.cid"),0,210,16|4);
}
protectedvoidpauseApp(){ message="I'mpaused."; showMsg(message); hasTested=true; resumeRequest(); } protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{ //TODOAuto-generatedmethodstub } privatevoidshowMsg(Stringmsg){ System.out.println(msg); }}例子中在MIDlet处于Active状态时调用notifyPaused和pauseApp方法,使应用程序进这入Paused状态,在Paused状态下又调用startApp方法,重新进入Active状态。这里设置了一个布尔变量hasTested,目的是为了防止循环。Destroyed状态在Paused或者Active状态下,应用管理软件可以调用方法destroyApp,向MIDlet发出信号终止运行并进入Destroyed状态。在Destroyed状态。在Destroyed状态MIDlet必须释放所有资源,并保存任何持久状态。被终止之前,MIDlet应该执行所有需要的操作,比如释放资源或者保存参数选择或状态,因此可以在这个方法里完成一些清除工作。这个方法有一个参数unconditional,如果它的值设置为false,就可通过抛出MIDletStateChangeException异常,使MIDlet能够请求不进入Destroyed状态,并且这将是unconditional标志设置为false时惟一合法的响应。如果为true,MIDlet被假定处于Destroyed状态,必须清除并释放所有的资源,而不管这个方法是如何终止的。如果它不是一个unconditional请求,通过抛出一个MIDletStateChangeException异常,使MIDlet表示它打算处于当前状态,这是一个比较好的请求,在迟些时候会再次调用destroyApp()方法。moto手机开发的问题,moto手机开发的问题,看别人的game源代码时,找不到resource(图片)的原因:
如果你还没有添加一个叫做J2ME_RESOURCE_DIR的新的环境变量的话,建立他,具体步骤如下:win98下:编辑c:\autoexec.bat文件,加入setJ2ME_RESOURCE_DIR=你的工程目录,重起系统。
win2k下:我的电脑-》属性-》高级-》环境变量-》系统-》添加-》名称:J2ME_RESOURCE_DIR
内容:你的工程目录配好后,每当你在jcreator中打开时,就自动转向你的J2ME_RESOURCE_DIR所指定的目录
MIDlet使用notifyDestroyed()方法通知应用管理软件它已经进入Destroyed状态,应用管理软件将不再调用MIDlet的destroyApp方法,MIDlet所拥有的所有资源将认为合法收回。MIDlet必须执行它调用MIDlet.destroyApp()方法时一样的操作(清除,释放资源等等)。因此在需要退出MIDlet的时候,可以调用notifyDestroyed()方法,而在destroyApp函数中完成一些清除工作。继续修改MyMIDlet.java前面的代码,使它能够退出应用程序并进行一些清除工作:importjavax.microedition.midlet.MIDlet;importjavax.microedition.midlet.MIDletStateChangeException;publicclassTestMIDletextendsMIDlet{ Stringmessage;//声明一个成员变量 booleanhasTested;//声明一个变量,代表是否测试过。 publicTestMIDlet(){//在构建函数里进行初始化工作 super(); message=newString("I'minitiated,adninPausedstate."); hasTested=false; showMsg(message); } protectedvoidstartApp()throwsMIDletStateChangeException{//在这里进行要完成的工作 message="I'minActivestatenow.";我在运行编译好的程序时,仿真器出现错误警告
我在运行编译好的程序时,仿真器出现Exception:java.lang.NoClassDefFoundError。请问是怎么回事?
可能有两个:首先,要注意Package路径,例如,对于packagecom.mot.j2me.midlets.test,您的类一定是在以下路径:%ClassPath%\com\mot\j2me\midlets\test\。其次,要注意大小写,例如,test.class和Test.class是两个不同的类。我在运行编译好的程序时,仿真器出现错误警告
我在运行编译好的程序时,仿真器出现Exception:java.lang.NoClassDefFoundError。请问是怎么回事?
可能有两个:首先,要注意Package路径,例如,对于packagecom.mot.j2me.midlets.test,您的类一定是在以下路径:%ClassPath%\com\mot\j2me\midlets\test\。其次,要注意大小写,例如,test.class和Test.class是两个不同的类。 if(!hasTested){ notifyPaused(); pauseApp(); }else{ notifyDestroyed(); } } protectedvoidpauseApp(){ message="I'mpaused."; showMsg(message); hasTested=true; resumeRequest(); } protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{ message="I'mdestroyed."; showMsg(message); message=null; } privatevoidshowMsg(Stringmsg){ System.out.println(msg); }}装入png图形文件时的问题:装入png图形文件时的问题:
我在装入png图形文件时,运行时出现如下Exception:imagecannotbeloadedordecoded。可是png文件在看图软件下显示很正常。应该如何正确显示呢?
先要用图形处理软件生成PNG文件,然后把它转换成字节数组,内容要一一对应。PNG的颜色应该为2bit或1bit,因为硬件设备只支持4级灰度显示。创建图的语句应该是如下格式:Image.createImage(byte[]imagedata,intimageoffset,intimagelength),其中,imagedata的格式为:{;(byte)0x89,(byte)0x50,(byte)0x4E,(byte)0x47,(byte)0x0D,destroyApp(true);另外,在MIDlet中永远不要使用“System.exit(0);”语句,否则它边应用程序管理软件也退出了。下面总结了一下本小节讲进的内容,MIDlet类的方法允许应用管理软件生成,启动,暂停和销毁MIDlet,可以认为MIDlet就是应用管理软件通过它的接口运行和控制其类的集合。它的状态机制允许应用管理软件在一个运行时环境中管理多个MIDlet的活动,通过分别启动和暂停,它可以选择让哪个MIDlet进入活支状态。应用管理软件维护MIDlet的状态,并在这个MIDlet上调用相应方法来改变状态。通过实现这些方法,MIDlet修正它的内部活动,资源的使用由应用管理软件控制。MIDlet本身也可以发起一些状态改变,并通过调用相应方法向应用管理软件通知状态的改变。注意,这些方法通过发送信号,通知状态的改变,但是直到状态改变方法成功返回,状态改变才算成功完成,也就是说这些方法调用会立即返回,不等待状态的真正改变。从MIDlet中访问JAR/JAD属性类MIDlet中的方法getAppProperty(StringKey)给MIDlet提供了一个机制,使它能从应用管理软件获取一个己命名属性,包括所有的定义在清单文件(在JAR文件中)和JAD文件的属性。如果有同名的属性,则JAD中的属性会覆盖清单文件中的相应属性。下面的例子展示了如何从jar/jad文件中读出并打印属性值,请读者根据学过的方法和本章开始的说明,自已生成一个项目,完成这个例子。MyMIDlet.jar中的manifest.mf文件的内容如下(打开项目目录中bin\子目录下的MANIFEST)MF文件,更改为下面的文件,然后保存:MIDlet-Version:1.0.0MIDlet-Vendor:gamecollegeMicroEdition-Configuration:CLDC-1.0MicroEdition-Profile:MIDP-1.0MIDlet-Name:MyMIDletMIDlet-Data-Size:1500MIDlet-1:MyMIDlet,,MyMIDlet有两个办法让你刚做好的图片在MIDlet上变成动画。第一,把图片都放到一个web服务器上,让MIDlet下载他们,
MIDP内置的HTTP支持。第二个办法更简单,把图片用MIDlet打包成jar文件。如果你使用的是J2ME开发工具,把PNG文件放你的项目文件里面就可以了。有两个办法让你刚做好的图片在MIDlet上变成动画。第一,把图片都放到一个web服务器上,让MIDlet下载他们,
MIDP内置的HTTP支持。第二个办法更简单,把图片用MIDlet打包成jar文件。如果你使用的是J2ME开发工具,把PNG文件放你的项目文件里面就可以了。MIDlet-Version:1.0.0MIDlet-Vendor:gamecollegeMIDlet-Jar-URL:MyMIDlet.jarMIDlet-Jar-Size:1000MIDlet-Name:MyMIDletMIDlet-Data-Size:1500MIDlet-1:MyMIDlet,,MyMIDletApplication-Country:China其中属性Application-Country是用户自定义属性。importjavax.microedition.midlet.MIDlet;importjavax.microedition.midlet.MIDletStateChangeException;publicclassMyMIDletextendsMIDlet{ protectedvoidstartApp()throwsMIDletStateChangeException{ System.out.println("Vendor:"+getAppProperty("MIDlet-Vendor")); System.out.println("ApplicationCountry:"+getAppProperty("Application-Country")); System.out.println("MIDlet-Data-Size:"+getAppProperty("IDlet-Data-Size")); } protectedvoidpauseApp(){ //TODOAuto-generatedmethodstub } protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{ //TODOAuto-generatedmethodstubMIDlet套件:MIDlet套件:虽然把MIDlet封装进Java档案文件(JAR)并不一定必要,但这是发布J2ME/MIDP应用程序最常见的方法。MIDlet套件是一个MIDlet中所有的文件以及作为MIDlet一部分的必需的资源的集合。MIDlet套件由以下几部分组成:1、附在JAR文件中的Java类文件,2、描述JAR文件内容的清单文件3、附在JAR文件中的资源(如图象)和Java应用程序描述符文件(JAD)4、应用程序管理器}Display类在第13章,我们曾简单的讲过Display类。用户界面和任何其他API资源一样,根据MIDP应用程序管理的原理进行控制,MIDP中使用类Display进行用户界面的管理,负责与应用程序管理器进行交互,参见下表。类Display方法说明java.lang.Object|+--javax.microedition.lcdui.Display方法voidcallSerially(Runnabler)这个方法用来序列化事件流,使Runnable对象r的run()方法在重画周期完成之后马上运行DisplayablegetCurrent()获得此MIDLet当前的Displayable对象staticDisplaygetDisplay(MIDletm)获得此MIDlet惟一的Display对象booleanisColor()获得设备所支持的色彩信息intnumColors()获得设备所能表示的色彩数目(如果isColor()返回true)或灰度级(如果isColor()返回false)voidsetCurrent(Alertalert,DisplayablenextDisplayable)请求这个Alert的对象被设置为当前的,在Alert解除之后把nextDisplayable设置为当前的voidsdtCurrent(DisplayablenexDisplayable)应用程序管理器是一个移动设备上的软件程序,这个应用程序与具体的设备有关,并且由设备的生产商实现。它负责安装、运行以及从设备上删除MIDlet,而提供错误处理支持。这个应用程序管理器同时还提供一个可选界面,允许用户启动、终止以及删除MIDlet。应用程序管理器是一个移动设备上的软件程序,这个应用程序与具体的设备有关,并且由设备的生产商实现。它负责安装、运行以及从设备上删除MIDlet,而提供错误处理支持。这个应用程序管理器同时还提供一个可选界面,允许用户启动、终止以及删除MIDlet。从类java.lang.Object继承的方法:equals,getClass,hashCode,notify,notifyAll,toString,waitDisplay代表了系统显示屏和输入设备的管理器,包含用来获取设备属性的方法,以及请求要在设备上显示对象的方法,其他处理设备属性的方法主要用于Canvas对象,这些方法将在介绍Canvas类时描述。一个MIDlet只能有一个Display实例,应用程序可以调用getDisplay()方法获取此实例的引用。应用程序从调用startApp()开始到destrlyApp()调用返回都可调用getDisplay()方法,期间所有调用getDisplay()返回的Display对象都是同一个对象。下面的例子展示了在一个MIDlet生存周期中如何调用Display对象:importjavax.microedition.lcdui.Display;importjavax.microedition.lcdui.TextBox;importjavax.microedition.lcdui.TextField;importjavax.microedition.midlet.MIDlet;importjavax.microedition.midlet.MIDletStateChangeException;publicclassTestDisplayextendsMIDlet{ Displaydisplay;//引用MIDlet的Display对象TextBoxtb;//TextBox是一个Displayable对象(可显示的控件) publicTestDisplay(){ display=Display.getDisplay(this);//获取一个Display实例,它是唯一的. tb=newTextBox("titile","XYZ",25,TextField.ANY);//初始化该控件 } protectedvoidstartApp()throwsMIDletStateChangeException{ display.setCurrent(tb);//将当前屏幕设置为该控件 } protectedvoidpauseApp(){Java档案文件:Java档案文件:一个商品化的、封装过应用程序通常由许多文件构成。除了Java类以外,其他文件诸如图像和应用程序数据即通常所说的资源,也可能是这个程序包的一部分。你把所有这些信息捆绑进一个整体,就称为JAR文件。 protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{ }}在这个例子中,首先声明了两个对象:Displaydisplay;//引用MIDlet的Display对象TextBoxtb;//textaBox是一个Displayable对象对象display用来引用设备的Display实例,一个MIDlet的实例是惟一的,在一个程序中可以多次引用此实例,但指向同一个对象。因为TexBox类继承了Screen类,而Screen类继承了Displayable类,因此textBox对象实例也发型Displayable类,它将作为参数传递给方法:voidDisplay.setCurrrent(DisplayablenextDisplayable);在构造函数TestDisplay()中,第一个语句用来获取设备的Display实例,第二条语句初始化一个TextBox类的实例textBox,它也是一个Displayable对象。方法startApp()中把textBox设置为当前屏幕对象。运行这个程序,应用程序管理器调用startApp()方法,把这个文本框设置为当前屏幕,如下图所示。TextBox类在下一章会有详细的介绍。Displayable类创建一个JAD文件是基于两个原因:创建一个JAD文件是基于两个原因:1、向应用程序管理器提供信息,说明JAR文件的内容,使用这些信息,就可以判断一个MIDlet是否适合运行在这个设备上。例如,通过查看属性MIDlet-Data-Size,应用程序管理器可以确定MIDlet是否需要比设备可以提供的更多的内存。2、提供一种方法,可以把参数传送到MIDlet而不必更改JAR文件,在本文的后半段我们将看一个这样的例子。类Displayable方法说明java.lang.Object|+-javax.microedition.lcdui.DisplayablevoidaddCommand(Commandcmd)向Displayable对象添加一个
Command对象booleanisShown()检查Displaysble对象在显示屏上是否真正可见voidremovdCommand(Commandcmd)从Displayable对象中删除一个Command对象voidsetCommandListener(CommandListener1)为这个Displayable对象设置一个CommandListener对象,它会取代任何前面设置的CommandListener对象从类java.lang.Object继承的方法:equals,getClass,hashClde,notify,notifyAll,toString,wait,类Displayable有两个直接子类:Canvas和Screen,前者是MIDPUI的低级API,后者则是MIDPUI所有高级组件的父类,因此Canvas和Screen及其子类都可作为参数传递给方法Displayable.setCurrent(DisplayablenextDisplayable)。方法isShown()用来检查Displayable对象在显示屏上是否真正可见。要使对象Displayable,下列所有条件都必须为真。此Display实例所在的MIDlet必须运行于前台。Displyable对象必须是此Display实例的当前屏幕。Displayable必须不被系统屏幕所覆盖。RetroGuard是RetroGuard是Java混淆器,使用时先安装JDK。运行前需要设置PATH外,还在CLASSPATH中加入D:\retroguard\RetroGuard.jar。然后准备混淆的.jar文件包。它的格式是:javaRetroGuard[输入JAR文件[输出JAR文件[“保留脚本文件”[日志文件]]]],
其中“保留脚本文件”描述了那些类、函数、变量名必须保留,不能被混淆;日志文件是执行后生成的记录文件,记录的错误、混淆情况等信息。对于“保留脚本文件”可以通过一个图形界面RGgui来设置,执行命令是:
javaRGgui
运行后,可以根据提示选择输入Jar文件,选择要保留的类、函数、变量,完成后会自动生成“保留脚本文件”。其实通常情况下只要保留运行的起始类名称就可以了。
方法addCommand(commandcmd)和removeCommand(Commandcmd)分别用来给Displayable对象增加和删除Command类,setCommandListener(CommandListener1)用来这为Displayable对象设置Command事件监听器。类Display的方法setCurrent()用来设置当前Displayable对象,方法getCurrent()用来获取当有Displayable对象。应用程序控制当前Displayable对象。不过并不总是这种情况,另一个线程可能响应其他的事件,改变当前Displayable对象,当Alert对象的计时器超时后当前Displayable对象也将会改变。应用程序的当前Displayable对象不一定绘制到屏幕上,用户事件(比如击键动作)的发生也不一定要定向到当前Displayable对象。在同一个设备上同时运行其他MIDlet应用程序的时候可能会出现这些情况。如果当前Displayable对象在显示设备上是实际可见的,并且如果用户输入设备事件将被传递给它,那么这个应用程序就被作位于前台:如果应用程序不在前台,就不能对显示屏和输入设备进行访问,则被称作位于后台。把这些设备分配给不同的MIDlet应用程序超出了MIDP规范规定的范围,它由称作应用管理软件的外部代理进行控制。应用程序任何时候都有当前Displayable对象的概念,即使它位于后台。当前Displayable对象十分重要,即使是对后台应用程序来说,因为当前Displayable对象总是在下次应用程序进入前台时所要显示的那个。应用程序可以通过调用isShown()方法来判断Displayable对象在设备上是否可见。如果是Canvas对象,调用showNotify()和hideNotify()方法可以分别使它可见和隐藏。设置当前Displayable对象方法setCurrent(DisplayablenextDislayable)用来设置Displayable对象,使它在显示屏上可见。通常这个改变不会立即生效,可能会有延迟,使它能够在两个事件传递方法的调用这间发生,但不能保证在下个事件传递方法被调用之前发生,不过setCurrent()方法会立即返回,而是不用等待改变生效。因为这个延迟,在调用setCurent()之后立即调用getCurrent()方法,不一定会返回传递给setCurrent()的那个值。对setCurrent()的调用不会使用队列机制,如果一个setCurrent()方法调用延迟,随后再次调用setCurrent()方法,前一个调用可能会被取消,例如如S1是当前屏幕,那么连续调用这两个方法之后:display.setCurrent(S2);display,setCurrent(S3);最终的结果会使S3成为当前屏幕,而S2则完取消了。PointBase非常独特,因为它是第一个经过认证的100%纯Java数据库,可用于任何使用的Java2标准版虚拟机(JVM)的平台。在2001年6月的JavaOne大会上,PointBase发布了PointBase袖珍版产品PointBase非常独特,因为它是第一个经过认证的100%纯Java数据库,可用于任何使用的Java2标准版虚拟机(JVM)的平台。在2001年6月的JavaOne大会上,PointBase发布了PointBase袖珍版产品——一个为J2SE和J2ME环境设计的占用资源少的(不到45KB)数据库。如果你的目标平台包含一个兼容J2ME的虚拟机,PointBase允许你部署一个SQL数据库应用程序。J2MEMIDP虚拟机目前可用于Win32,PalmOS,WindowsCE和摩托罗拉IDEN电话。应用程序可以把null作为参数传递给setCurrent(),但设置当前Displayable对象为null时不会产生效果,相反当前Displayable对象会保持不变。但是应用管理软件会把这解释为来自应用程序的一个暗示,即应用程序请求被置入后台。如果应用程序已经在后台运行,传递一个非空引用给setCurrent()会被应用管理软件解释为应用程序请求被置入前台的一种暗示,这个请求可把录前Displayable对象传递给setCurrent()调用,例如下面的代码:display.setCruuent(display.getCurrent());这个请求没有效果,只是请求把应用程序置入前台。这些请求仅仅是暗示,而并不要求应用管理软件完全遵照这些请求执行。获取当前Displayable对象每个MIDlet应用程序都有当前Displayable对象,意味着getCurrent()方法总会返回MIDlet的当前Displayable对象,而不管MIDlet是位于前台还是后台。例如假定一个MIDlet正在运行于前台,它有当前的Displayable对象F,一个MIDlet正在运行于后台,有当前的Displayable对象B。当前台MIDlet调用方法getCurrent(),它将返回F,当后台MIDlet调用getCurrent()方法,它将返回B。并且,如果某个MIDlet通过用setCurrent()方法改变了当前的Displayable对象,这不会影响任何其他MIDlet的当前Displayable对象。调用getCurrent()方法还可能返回null,启动期间MIDlet应用程序调用setCurrent()设置它第一个屏幕之前会发生这种情况。即在MIDlet调用setCurrent()方法之前,getCurrent()方法永远也不会返回一个Displayable对象的引用。在“设置Displayable对象”小节中已经说明,方法setCurrent()设置一个Displayable对象,使它显示在显示屏上,但这个改变通常不会立即生效,它可会有延迟。因为这个延迟在
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑电气照明系统控制线路敷设要求制定方法选择
- 数控车床加工仿真系统维护保养课程设计
- 手卫生要求及管理
- 麻醉科全麻醉风险评估规范
- 全科医学科基层医疗诊治指南
- 全科医学科家庭护理要点
- 淋巴瘤康复训练计划
- 泌尿外科腹腔镜胆囊切除术围手术期护理指南培训
- 海洋设计创新与实施框架
- 旅居设计案例分享
- GB/T 46623-2025金属增材制造成形件机械性能与其取样方向、位置的相关性
- 《泰国人学汉语》课件
- 资产重组在制造业中的应用与前景研究报告
- DB33∕T 1398-2024 惠民型商业补充医疗保险服务规范
- 地贫防控知识培训课件
- 2024年浙江省慈溪市中考数学考前冲刺试卷及参考答案详解【培优】
- GB/T 26941-2025隔离栅
- 一张纸水库防汛应急预案
- 健康教育学题库及答案
- 四川省成都市天府七中2024-2025学年八年级下学期第二次段考数学试卷(含答案)
- 新疆公务员面试题目及答案
评论
0/150
提交评论