1、Hello World手机程序 

像学习其它编程语言一样,我们先试着编写一个最简单的经典Hello World手机版程序。常言道:“麻雀虽小,五脏其全”,Hello World程序虽然小的不能解决什么问题,但是它具备有MIDP程序必需的框架代码。下面我们将重点以Hello World为蓝本,介绍MIDP程序的框架和实现过程。

首先,请启动WTK工具中的KToolbar程序,点击“新建项目…”,项目名和MIDP类名都输入为Hello。此时,WTK的apps子目录下创建了一个Hello目录,请使用打开Hello目录下的src子目录,在该目录下创建一个新文件Hello.java,使用NotePad(或UE等)打开Hello.java文件,输入如下代码(注意:每行代码前的行号不要输入,这是方便讲解而加的):

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Hello extends MIDlet {
    private Display display;
    public Hello() {
        display = Display.getDisplay(this);
    }

    public void startApp() {
        TextBox t = new TextBox(
                "First MIDP Programe", "Hello World!", 50,
                TextField.ANY);
        display.setCurrent(t);
    }

    public void pauseApp() {}

    public void destroyApp(boolean unconditional) {}
}

写完这些代码后,请一定要记住保存。再次切换到Ktoolbar程序,点击“生成”按钮,如果你在录入程序代码时未出现错误的话,编译过程一定是成功的,但是如录入有误,编译时会在中间的文本框中显示错误行号和信息。如编译成功,点击“运行”按钮,启动模拟器,选择启动软键(或Select键),运行Hello World程序,运行结果如图一所示:

图一:Hello World程序运行结果 

 

2、解读Hello World程序 

Hello World程序是我们第一个Java手机程序,虽然它简单的仅仅只能在手机屏幕上显示Hello World字符串,但是它足以激动人心。下面让我们一起认识一下这些代码。

程序代码中的第(1)和(2)行,分别对代码中使用的类库进行预先声明。Hello World程序代码中仅调用了javax.microedition.midlet.*和javax.microedition.lcdui.*两个类库中的类,所以只用声明输入这两个类库即可。其中,javax.microedition.midlet.*类库是J2ME/MIDP程序的必须的最基本类库,如果没有输入该库,程序将不能通过编译。javax.microedition.lcdui.*类库主要是提供由CLCD层提供的服务,如果MIDP程序中不调用任何CLCD层服务,则可以不输入该类库。但是,在一般应用中大部分MIDP程序都会调用CLCD层提供的基本的界面服务。

从第(3)行开始,为程序的真正实现代码部分,纵观这些代码,它仅实现了一个Hello类,该类为根据javax.microedition.midlet.MIDlet的派生子类。根据J2ME/MIDP2.0规范规定,每个MIDP程序至少提供一个从MIDlet类中派生出的子类,并通过基类MIDlet为MIDP程序提供基本的KVM底层服务。

该Hello类由一个构造函数和三个成员函数组成。其中,构造函数主要完成一些初始化工作,此处用于初始化获取当前屏幕对象Display,通过这个屏幕对象才可以处理有关屏幕界面操作,在startApp函数中将使用该对象显示字符串。除了构造函数以外,Hello类还提供了startApp、pauseApp和destoryApp三个成员函数,它们在MIDlet基类中都是声明为抽象函数,所以要求每个MIDlet子类都必须实现这三个函数。其中这三个函数的作用分别表示启动、停止和消灭MIDP程序,它们直接影响到MIDP程序的整个生命周期,后面我们将重点介绍MIDP程序的生与死。

由于Hello World程序仅实现在手机屏幕显示一行字符串,所以我们只在startApp函数中提供了二行显示字符串相关的代码。首先,创建一个TextBox对象t,类似于PC机界面上的文本框,其四个构造参数分别表示为标题名、文本、最大长度和允许输入的字符类型。再使用display.setCurrent(t)语句将t对象设置为当前手机屏幕的显示界面,此时整个手机屏幕将被一个TextBox对象填充。

3、MIDP程序生与死 

通过对Hello World程序代码的解析,我们对MIDP程序的基本框架有了一个直观的认识。但是事实上,MIDP程序在J2ME平台上的运作稍微复杂一点,下面我们要仔细探讨MIDP程序的运作细节,也就是MIDP程序的生命周期。

每个MIDP程序都必须工作上J2ME平台下,也就是说只有你的手机配置有J2ME才能运行Hello World程序。当用户选择运行MIDP程序时,工作在后台的JAM(Java Application Manager程序管理器)的服务程序将加载该MIDP程序代码,JAM自动查找MIDP程序中实现的MIDlet子类,为其创建对象并通过构造函数进行相关初始化操作,至此该MIDP程序的生命周期就开始了。(图二展示了MIDP程序的生命周期状态转换关系。)MIDP程序的生命周期完全由JAM控制,也就是说,当MIDP从一个工作状态变成另外一个工作状态时,JAM将会调用相应的状态改变函数,如startApp、pauseApp和destoryApp等。在整个生命周期中,MIDP程序只可能处于三种状态中的一种,这三种状态分别为启动/激活状态(Active)、停止状态(Paused)和消灭状态(Destroyed)。JAM成功加载后,MIDP程序就进入了停止状态,然后JAM将其状态转换为启动状态并调用startApp函数。请大家一定要记住,MIDP程序的状态的改变只能由JAM来完成,应用程序不能直接通过调用状态改变函数,如startApp、pauseApp和destoryApp,来改变状态。当程序进入启动状态时,表示该MIDP程序真正进入了工作状态,此时程序按照事件过程运行。在程序处于运行过程中,有时由于JAM为了某些需要,必须先停止该MIDP程序的运行,例如手机来了电话、闹铃响了、或者用户切换到其它程序运行等,在这些情况下,为了避免MIDP程序占用太多系统资源,所以JAM就会调用pauseApp函数,将该MIDP程序切换到停止状态,所以我们应该在pauseApp函数之中放置一些需要释放一些非必需的资源。当相应的任务完成后,JAM会再次调用startApp函数,重新切换到启动状态。如果用户按了手机了停止键或通过程序界面退出程序时,JAM将调用destoryApp函数,并将程序状态切换到消灭状态,到此该MIDP程序的生命终止。

图二:MIDP程序生命周期中工作状态转换图

 

4、下载Hello World程序到手机上 

当我们将编译过的MIDP程序放在模拟器上调试成功之后,接下来就可以将该MIDP程序下载到你的手机上运行了,这才是我们真正所需要的。一般你可以根据实际情况选择两种方法下载程序到手机,一种是利用手机所提供的传输线,让你的MIDP程序能够从PC或其他设备下载到手机上;另一种方法是将你的MIDP程序配置到一个互联网上的Web服务器上,再用你的手机通过互联网下载程序。其中第一种方法会根据不同的手机厂商及手机款式各有所不同,所以本文将不能逐一介绍,你可以参考手机说明书。下面我们将重点介绍第二种方法下载程序到手机。

首先,你需要在安装一个Web服务器到PC机上,建议下载免费的Apache服务器,下载网站为www.apache.com,限于篇幅,Apache服务器的安装和配置细节省略,可参考安装和配置文档。现假设你的PC上已经成功了Apache,安装目录为C:\Apache。

接下来,打开C:\Apache\conf\mime.types文件,在该文件text/…中增加一行:

text/vnd.sun.j2me.app-descriptor   jad

编辑完该文件一定要记得保存啊。

最后,将Hello World程序的bin子目录下的Hello.jar和Hello.jad拷贝到C:\Apache\htdoces\Hello目录下即可。如果当前已经启动了Apache服务器,需要先停止服务后重新启动服务才能生效。

现在可以打开手机,选择从互联网下载Java程序,IP地址填写运行Apache服务器的PC的IP地址即可,手机将自动将Hello World程序下载到手机上。