MIDP 实例 I
下面是一个简单的midlet,它会在屏幕上显示字符串Commander,并显示一个Exit的软键,按下这个软键会退出程序。
源码
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class Commander extends MIDlet {
public void startApp() {
Displayable d = new TextBox("TextBox", "Commander", 20, TextField.ANY);
Command c = new Command("Exit", Command.EXIT, 0);
d.addCommand(c);
d.setCommandListener(new CommandListener() {
public void commandAction(Command c, Displayable s) {
notifyDestroyed();
}
} );
Display.getDisplay(this).setCurrent(d);
}
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
}
说明
这里涉及了MIDP程序的几个基本概念:
* MIDP程序被称为midlet,它的生命周期很简单,创建并构造后处于paused状态,然后通过StartApp进入Actived状态,退出时会调用DestroyApp函数,而actived状态可以通过调用pauseApp()回到paused状态,因此,一个midlet总是能看到这几个基本函数, 这几个函数通常是被应用程序管理器调用的,但程序自己也可以调用(下面讲解)。
* Display对应了整个midlet的显示部分,它有可能是不可见的(比如处于后台的midlet),而在Display上,自然可以设置Displayable对象,这个Displayable对象就象一般的GUI widget,有其家族谱系,不过在MIDP中,GUI widget比较简单,上面的例子用到的是TextBox。
* MIDP对用户输入做了高度抽象,Command就是抽象后的产物,它表示MIDP设备(比如手机)的一个输入,不同的设备上的Java实现会将Command对应到设备的某个输入上,比如使用软键,触摸屏等。多个Command可以加入到一个Displayable对象上,表示在显示这个对象时可执行的多个动作,而这些Command的安排也由Java实现去安排(比如组织为多个软键,或菜单)。
* Command可以注册一个CommandListener来执行command的响应,实际上就是一个回调函数了。上面的例子很简单,为了退出,调用了一个notifyDestroyed。
NotifyDestroyed和DestroyApp(boolean)
这个区别很重要:
* 当midlet被强制退出(比如用户通过程序管理器杀程序),DestroyApp会被调用,并带参数true,这种情况下notifyDestroyed不会被调,也不需要主动调。
* 而应用程序自己希望退出时,比如用户按了什么键,或工作已经做完了,那么应该调用NotifyDestroyed(),这时DestoyApp不会被触发,但通常主动退出前,也需要清理资源,所以一般的程序会在NotifyDestroyed前调用DestroyApp,会了和上面的退出区别,通常会带个false参数,但实际上这种情况下,不是一定要DestroyApp(比如没有资源需要释放),也不是一定要带false参数(比如没有什么需要和强杀区别,所以也可以带true参数)。
编译和发布
在Netbeans里面,无论选择何种configuration,这小程序都是能编译,仿真运行的,但要是想发布到手机上,必须选择合适的Device Configuration和Device Profile(Device倒是无所谓,似乎只影响仿真),比如对于N73,缺省的MIDP-2.1会导致最终程序无法在手机上安装,降为MIDP-2.0就可以了。
源码
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class Commander extends MIDlet {
public void startApp() {
Displayable d = new TextBox("TextBox", "Commander", 20, TextField.ANY);
Command c = new Command("Exit", Command.EXIT, 0);
d.addCommand(c);
d.setCommandListener(new CommandListener() {
public void commandAction(Command c, Displayable s) {
notifyDestroyed();
}
} );
Display.getDisplay(this).setCurrent(d);
}
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
}
说明
这里涉及了MIDP程序的几个基本概念:
* MIDP程序被称为midlet,它的生命周期很简单,创建并构造后处于paused状态,然后通过StartApp进入Actived状态,退出时会调用DestroyApp函数,而actived状态可以通过调用pauseApp()回到paused状态,因此,一个midlet总是能看到这几个基本函数, 这几个函数通常是被应用程序管理器调用的,但程序自己也可以调用(下面讲解)。
* Display对应了整个midlet的显示部分,它有可能是不可见的(比如处于后台的midlet),而在Display上,自然可以设置Displayable对象,这个Displayable对象就象一般的GUI widget,有其家族谱系,不过在MIDP中,GUI widget比较简单,上面的例子用到的是TextBox。
* MIDP对用户输入做了高度抽象,Command就是抽象后的产物,它表示MIDP设备(比如手机)的一个输入,不同的设备上的Java实现会将Command对应到设备的某个输入上,比如使用软键,触摸屏等。多个Command可以加入到一个Displayable对象上,表示在显示这个对象时可执行的多个动作,而这些Command的安排也由Java实现去安排(比如组织为多个软键,或菜单)。
* Command可以注册一个CommandListener来执行command的响应,实际上就是一个回调函数了。上面的例子很简单,为了退出,调用了一个notifyDestroyed。
NotifyDestroyed和DestroyApp(boolean)
这个区别很重要:
* 当midlet被强制退出(比如用户通过程序管理器杀程序),DestroyApp会被调用,并带参数true,这种情况下notifyDestroyed不会被调,也不需要主动调。
* 而应用程序自己希望退出时,比如用户按了什么键,或工作已经做完了,那么应该调用NotifyDestroyed(),这时DestoyApp不会被触发,但通常主动退出前,也需要清理资源,所以一般的程序会在NotifyDestroyed前调用DestroyApp,会了和上面的退出区别,通常会带个false参数,但实际上这种情况下,不是一定要DestroyApp(比如没有资源需要释放),也不是一定要带false参数(比如没有什么需要和强杀区别,所以也可以带true参数)。
编译和发布
在Netbeans里面,无论选择何种configuration,这小程序都是能编译,仿真运行的,但要是想发布到手机上,必须选择合适的Device Configuration和Device Profile(Device倒是无所谓,似乎只影响仿真),比如对于N73,缺省的MIDP-2.1会导致最终程序无法在手机上安装,降为MIDP-2.0就可以了。

0 Comments:
发表评论
<< Home