几个基本概念的学习。
应用程序管理器(Java Application Manager,JAM),在规范中也称做Application Management Software(AMS)。这是一个用来执行J2ME应用程序的原生程序(Native,代表通常用C/C++撰写而成),应用程序管理器负责管理在设备上所有的J2ME应用程序。
MIDlet:一个可以执行的应用程序基本单位。除了继承自javax.microedition. midlet.MIDlet之外,还包括让此类可以顺利执行的所有其它类和资源文件(只要是非class文件都称做资源文件)所构成的集合。
JAR文件(JAR File,.jar文件):实际上是包裹住MIDlet Suite的文件,属于ZIP压缩格式。
描述文件(Descriptor File,.jad文件):用来描述MIDlet Suite基本信息的文本文件,包括MIDlet Suite所包含之MIDlet相关信息(类名称、图标、程序名),或是MIDlet Suite之整体信息(文件大小、安全权限、证书等),这是一个外部文件(不存在JAR文件内部,独立存在的文件)。
JAD与JAR的内容:理论上,每个MIDP应用程序都是由一个JAD文件与一个JAR文件所构成,两者缺一不可。但是实际的情况下,在某些设备上部署MIDP应用程序时,该设备上的应用程序管理器并不要求一定要有JAD文件,有些甚至会自己产生对应的JAD。在MIDP 1.0时,是否有JAD文件无关痛痒。但是在MIDP 2.0之中,是否有JAD文件将涉及安全议题。
JAD文件是一个纯文本文件,所以内部都是一些属性和属性值。而JAR文件除了包含MIDlet以及其它相关的class文件(辅助类、程序库)之外,还包含了:
1.资源文件
MIDlet执行时所需要的文件,如图片、文本文件等,只要不是class文件,都称做资源。另外规范有规定,class文件不能当做资源来使用。
2.清单文件(Manifest File,Manifest.mf)
用来描述一个MIDP应用程序之基本信息,包括MIDlet Suite所包含之MIDlet相关信息(类名称、图标、程序名),或是MIDlet Suite之整体信息(名称、版本号码、制作者等)。这是一个内部文件(存在于JAR文件内部)。
MIDlet的基本程序结构:
javax.microedition.midlet.MIDlet类中定义了三个抽象方法(abstract),因此我们自己撰写MIDlet必须实现他们,这三个抽象方法分别是:
l startApp() 转至运作状态;
l pauseApp() 转至停止状态;
l destroyApp() 转至消灭状态。
使用Display.getDisplay(this)来取得代表该设备显示画面的Display对象。从应用程序管理器调用startApp()到MIDlet结束运作这段时间之内,不管何时调用Display.getDisplay(this),取得的都是同一份Display对象的引用。所以通常我们会将取得的Display对象保留下来,供往后使用。要设定显示在屏幕上的画面,使用Display对象的引用,并调用其setCurrent()方法:
display.setCurrent( Displayable类的子类实体)
千万不要将只需要执行一次(例如初始化)的程序代码写在startApp()之中,因为startApp()在整个MIDP应用程序的周期里不只被执行一次。
MIDlet管理自己的生命周期
应用程序管理器来控制MIDlet的生命周期之外,MIDlet本身也可以软性地决定自己的状态,但不是自己改变自己的状态,而是MIDlet先调用上述相对应的状态改变函数,这些函数会发出信息通知应用程序管理器,请它来帮我们改变MIDlet的状态,但是决定权在于应用程序管理器,不保证一定可行。
startApp()、pauseApp()以及destroyApp()并非控制MIDlet生命周期的函数,它们只是一个提供我们初始化资源、释放资源的地方而已。
随机数:
java.util包之中有个Random类,负责用来产生随机数(只能是int或long类型的随机数)。所以使用前,我们必须先产生Random类,您可以用
Random rdm = new Random(seedvalue) ;
其中seedvalue是随机数种子。或者您也可以用
Random rdm = new Random() ;
这个构造函数会在内部调用
this(System.currentTimeMillis());
它会根据当时的时间设定随机数种子。任何时候我们都可以调用setSeed()来设定随机数种子。
我们想要自定随机数产生的范围,那么就要用到一些技巧。举例来说,如果你想要产生-160~160之间的数值,我们就必须用到余数运算符(%):
int res = rdm.nextInt()%160 ;
如果想要产生0~160之间的数值,由于int本身是有号数,而且为32 Bits。必须把第一个Bit设定成0(代表正数)才行,我们可以使用
int res = (rdm.nextInt() >>> 1)%160 ;
利用无号移位运算符。或
int res = (rdm.nextInt() & 0x7FFFFFFF)%160 ;
把第一个Bit设成0。两种方法皆可。
相反如果想要产生-160~0之间的数值,只要把第一个Bit设成1即可。我们可以把上述产生正数的方法前面加上负号。也可以用
int res = (rdm.nextInt() | 0x80000000)%160 ;
完善中。。。
完善中。。。
完善中。。。
完善中。。。