1.4 MIDP应用程序——MIDlet

MIDlet是MIDP应用程序的基本执行单元,是Sun公司对MIDP上的应用程序的一个独特叫法,意思是“MIDP小应用程序”。它是为满足小型资源受限设备的特殊要求,由MIDP规范所定义的一种全新的应用程序模型。MIDlet与标准Java程序中的Applet小应用程序一样,必须运行在某特定的环境中,或者说,运行在作为容器的大应用程序中。这个大容器可以适应不同厂家、不同型号和多种功能的移动设备。然而这个容器的内部为MIDlet提供了一个统一的接口。程序的开发者只需要编写规范的MIDlet就可以了。

下面考察一个最简单的MIDlet应用程序(HelloChina程序),通过这个例子可以了解MIDlet程序的基本结构特征。

例1-1 在屏幕上显示“中国 你好!”。

源程序名:HelloChina·java

            import javax.microedition.midlet.*;
            import javax.microedition.lcdui.*;
            public class HelloChina extends MIDlet implements CommandListener {
                    private Display display;
                    private Command exitCommand;
                    private TextBox t;
                    public HelloChina() {
                        display = Display.getDisplay(this);
                        exitCommand = new Command("Exit",Command.SCREEN,1);
                        t = new TextBox("Hello","中国 你好!",256,TextField.ANY);
                        t.addCommand(exitCommand);
                        t.setCommandListener(this);
                    }
                    public void startApp() {
                        display.setCurrent(t);
                    }
                    public void pauseApp() {
                    }
                    public void destroyApp(boolean unconditional) {
                    }
                    public void commandAction(Command c,Displayable s) {
                        if(c==exitCommand) {
                            destroyApp(false);
                            notifyDestroyed();
                        }
                    }
            }

经过编译,在仿真器上的运行结果如图1-3所示。

图1-3 HelloChina运行结果

从这个简单程序可总结出如下MIDlet程序的基本特征。

(1)每一个MIDlet程序必须是javax·microedition·midlet·*包中MIDlet类的子类。

作为MIDP应用程序的MIDlet,它一定是MIDlet类的子类。这样,设备的应用管理软件才能对MIDlet进行管理和控制。在这个例子中,MIDlet应用程序HelloChina 类就是继承MIDlet 类而来的。

(2)每一个MIDlet可以有一个构造方法。

MIDP 应用程序模型规定,构造方法仅被系统调用一次,用来初始化一个 MIDlet 的状态。构造方法要执行的操作取决于程序的需要。通常,将所有要在启动时执行,且只执行一次的操作放在构造方法中。同时,应捕获在构造方法中可能出现的异常,并处理之。

(3)每一个MIDlet必须实现用于控制程序生命周期的三个抽象方法。

当 MIDlet 被初始化后就进入它的生命周期,该生命周期包含三个状态:激活态(Active)、暂停态(Paused)和销毁态(Destroyed),这三种状态的控制完全由应用程序管理器 JAM(Java Application Manager)来完成。当出现状态迁移时,JAM会自动调用MIDlet在本例中出现的三个抽象方法:startApp( )、pauseApp( )和destroyApp( ),如图1-4所示。需要注意状态迁移与方法调用的因果关系,状态迁移是因,方法调用是果。

图1-4 MIDlet状态迁移触发的方法调用

JAM加载MIDlet后,首先进行初始化的工作,将状态设置为暂停态。如果在初始化的过程中没有出现任何异常,那么MIDlet的状态转为激活态,否则将MIDlet的状态设置为销毁态。在每次状态转换的时候都要调用相应的方法。

为此,在定义MIDlet类时需要实现这些状态转移时调用的方法,从而完成自定义的过程。一般,在startApp方法中定义程序运行时用到的资源,在pauseApp方法中释放暂时不使用的资源(避免因为状态切换使得系统资源被占用),在destroyApp方法中释放所有自己定义的资源。

在任何时刻,JAM都可能改变MIDlet的状态,为此这些方法有可能多次被调用,于是问题产生了。如果多次调用startApp方法就意味着多次定义资源,为此必须设计好一个资源定义的规划。一般来说,在startApp方法中定义那些临时性的资源,在pauseApp方法中释放,除startApp方法中定义的那些资源外,剩余的资源在MIDlet构造方法中定义。

(4)MIDlet 通常都会实现CommandListener接口。

CommandListener接口的实现是为了使应用程序对用户的操作做出反应。这个接口及TextBox、Command和Display类,都是javax·microedition·lcdui·*包的一部分。