第九章:midp api
- 介绍
移动信息设备简表 (midp) 适合类似于蜂窝电话和寻呼机这样的设备。midp,就象 kjava 一样,同样也建立在 cldc 之上。mid 简表提供一种标准的运行时环境,允许在终端用户设备上动态地配置新的应用程序和服务。
在本章中,我们将详细地讨论 mid 定义的七个软件包。我们还将建立一个 midp 应用程序示例。
- ui 设计注意事项
midp 包括一个低级的 ui api 和一个高级的 ui api。低级的 api 允许您完全访问一个设备的显示屏,也允许访问原始键和指针事件。然而,使用低级 api 时, 没有可用的用户界面控件。应用程序必须精确地绘制出按钮和其它所有的控件。
相反,高级 api 提供简单的用户界面控件但不能直接访问原始的输入事件或显示屏。由于显示屏的尺寸和 midp 设备输入方法的差异,控件显得很抽象。midp 的实现确定了绘制控件的方法,也确定了如何管理用户输入。
让我们在后面的章节里更进一步了解 midp 的软件包和类。
- midp api
midp 包含四个核心 cldc 软件包 (java.lang、java.io、java.util 和 javax.microedition.io),另加下面的三个特定于 midp 的软件包:
? javax.microedition.lcdui
? javax.microedition.midlet
? javax.microedition.rms
我们将在本章的后面部分详细介绍特定于 midp 软件包。除了上面新的软件包之外,midp 还向核心 cldc 软件包添加了四个新类,如下所示。
? java.util.timer -- 用于为后台线程中将来要执行的任务确定时间。
? java.util.timertask -- 被 java.util.timer 类使用,用来为后台线程中稍后的执行定义任务。
? javax.microedition.io.httpconnection -- 一个接口,为 http 连接定义必要的方法和常量。
? java.lang.illegalstateexception -- 一个 runtimeexception, 指出在不合法或不合适的时间已经调用的一个方法。
- midlet 介绍
midlet 是一个 java 类,它扩展了 javax.microedition.midlet.midlet 抽象类。实现 startapp()、pauseapp()和 destroyapp()方法,这些方法类似于 j2se 的 java.applet.applet 类中的 start()、stop()和 destroy()方法。
除了扩充 javax.microedition.midlet.midlet 的主 midlet 类之外,一个 midp 应用程序通常还包括其它一些类,这些类能随它们的资源一起被打包成为 jar 文件 -- 称之为 midlet 套件。一个 midlet 套件中的不同 midlet 能共享 jar 文件的资源,尽管不同套件中的 midlets 不能直接相互作用。
midlet 在应用程序生命周期中有三种可能的存在状态 -- 运行状态、暂停状态、销毁状态。运行状态,正如其名称所暗示的,意味着 midlet 正在运行中。这种状态始于 startapp 方法被调用时。在暂停状态中,midlet 持有的所有资源将被释放,但是它准备着再次被运行。调用 notifypaused 方法时,midlet 处于暂停状态。在销毁状态中,midlet 已经永久地将其自身关闭,释放所有的资源,等待着废物清理程序的处理。它是通过 notifydestroyed 方法来调用的。
在接下来的两页中,我们来看一个简单的 helloworld midlet。
- helloworld midlet
与使用 kjava helloworld 应用程序一样,这个 midlet 也会在 midp 设备的显示屏上显示 "hello world!" 和 exit 按钮,按下该按钮会终止应用程序。
helloworld.java 文件以下面的代码行开始,这些代码行导入稍后会在 helloworld 类中使用的类:
import javax.microedition.midlet.midlet;
import javax.microedition.lcdui.command;
import javax.microedition.lcdui.commandlistener;
import javax.microedition.lcdui.display;
import javax.microedition.lcdui.displayable;
import javax.microedition.lcdui.form;
由于 helloworld 类是一个 midp 应用程序,它扩展了 midlet。它也实现 commandlistener 接口来处理事件:
public class helloworld extends midlet implements commandlistener
下面的方法是一个缺省构造程序,它创建一个新表单,在上面初始化控件,然后显示出来:
private form form;
public helloworld()
{
// create a new form on which to display our text
form = new form("test app");
// add the text "hello world!" to the form
form.append("hello world!");
// add a command button labeled "exit"
form.addcommand( new command( "exit", command.exit, 1 ) );
// register this object as a commandlistener
form.setcommandlistener( this );
}
调用 startapp() 方法启动应用程序与小应用程序的启动方法很象。在 midle 的一次执行中它可能会被调用多次。如果 midlet 暂停,pauseapp() 将会被调用。要重新启动 midlet,需调用 startapp()。仅须执行一次的主初始化代码应该放置在构造程序中:
public void startapp()
{
// get a reference to the display, and show the form
display display = display.getdisplay(this);
display.setcurrent( form );
}
pauseapp() 被调用使得 midlet 处于暂停状态。在此应用程序中,当进入暂停状态时,我们没执行任何操作;但是我们仍然需要在 midlet 中实现 pauseapp 方法,因为它是父 midlet 类中的抽象方法。
public void pauseapp() { }
destroyapp() 被调用,破坏了 midlet 并使其处于销毁状态。在此应用程序中,我们通过将引用设为 null,释放了对表单的引用。
public void destroyapp(boolean unconditional)
{
form = null;
}
commandaction() 方法是事件处理程序,被请求实现 commandlistener 接口。目前,它破坏了应用程序并通知应用程序管理软件 midlet 已经完成。
public void commandaction(command c, displayable d)
{
// destroy this midlet
destroyapp(true);
// notify the application management software that this midlet
// has entered the destroyed state
notifydestroyed();
}
- midp 软件包
除标准 cldc 软件包之外,midp 还包含三个附加的软件包:
? javax.microedition.lcdui -- 定义用来控制 ui 的类。这个软件包既包含高级 ui 类(例如 form、command、datefield 和 textfield 等),又包含低级 ui 类(允许用低级方式控制 ui)。
? javax.microedition.midlet -- 包含 midp 主类中的一个,midlet 类,为 midp 应用程序提供访问关于其运行所在环境信息的权限。
javax.microedition.rms -- 定义一个类的集合,这些类为 midlet 提供了永久存储并随后重新得到数据的机制。
闽公网安备 35060202000074号