`
Teok
  • 浏览: 147927 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MIDlet API 2.0学习之:javax.microedition.midlet

    博客分类:
  • J2ME
阅读更多
包说明:MIDlet包定义了MIDP(移动咨询设备简表)
MIDlet包定义了MIDP应用和应用程序和应用程序运行环境之间的交互信息。一个MIDP应用就是一个MIDlet。

应用程序
MIDP定义了一个应用程序模型:允许设备的有限资源在多个MIDP应用程序(或多个MIDlet)之间共享。它定义了一个MIDlet是什么、怎样包装、MIDlet上有什么可用的运行时和它该如何运转以保证设备可以管理它的资源。这个应用程序模型定义了多个MIDlet如何组成一个套件能在一个JVM的上下文(运行时环境)中统一地包装和共享资源。对设备的有限资源和安全框架的共享是可以的,只要让它们按照需要共享类文件并且遵循一个单一的策略和控制规则。
MIDP MIDlet Suite(MIDP MIDlet套件)

随着一个MIDP应用的开发、测试、部署和运行,它必须使用MIDP规范中指定的功能。
一个MIDlet套件拥有如下元素:
  *  运行时执行环境

  *  MIDlet套件包

  *  应用程序描述信息(jad: j2me application descriptor)

  *  应用程序生命周期

每个设备被认定来实现用户需要的安装、选择、运行和去除MIDlet功能。规则应用管理器被用来和这些设备特定的功能关联。应用管理器提供了一个MIDlet安装、开始、停止和卸载的环境。在MIDlet套件的安装、执行和去除和用户进行需要的交互时处理错误是很重要的。它给MIDlet提供了MIDP规范需要的java运行时环境。
一个或多个MIDlet可以被到一个单独的JAR文件。每个MIDlet由一个继承自MIDlet类的类和其它这个MIDlet所需的类组成。JAR文件中的清单文件包含了MIDlet安装和运行时所需要的属性。MIDlet是应用程序管理器能启动的实体。当一个MIDlet套件被调用了,就需要一个在其上可以执行类文件的JVM。应用程序管理器(可以认为是J2ME程序管理器)常见一个MIDlet的新实例,让它来指挥MIDlet的start,pause和destroy itself.
MIDlet间的数据和其它信息的共享是通过其它独立的API及其实现来控制的。例如:Record Management System API指定当record store的相关操作。


MIDlet Suite Security
MIDP 1.0规范约束:每个MIDlet suite在一个MIDlet API全部可用的沙箱了进行操作,以此来组织MIDlet程序访问设备的敏感功能。这个规范中使用了沙箱这个概念,并且所有不被信任的MIDlet套件都要遵循这个沙箱的限制。该规范的每个实现必须(MUST)支持不被信任的MIDlet程序的运行。

MIDP 2。0规范介绍了可信应用程序可以被允许使用那些被认为敏感的和须要受限制的API。如果当一个设备根据MIDlet程序所提供的安全策略文件认为该MIDlet程序是可信的,那么它会允许该MIDlet程序访问那些受限资源和功能。详细介绍请看:Security for MIDP Applications

MIDP Execution Enviroment

MIDP为MIDlet定义了运行环境。在一个MIDlet套件(就是一个或多个MIDlet组构成MIDlet应用)中,运行环境是被其中所有MIDlet共享的,并且任何MIDlet都可以和套件内其它MIDlet交互。应用程序管理器初始化应用以使得以下元素对于这个MIDlet是可用的:
  * 实现自CLDC的类和本机代码,包括一个JVM
  * 实现自MIDP运行时的类和本机代码
  * 一个单一JAR文件中所有用来执行的类
  * 一个单一JAR文件中所有作为资源的非类文件
  * 当存在描述文件时,它的内容
  * 设备上任何其它可用的API,例如额外的JSR实现类、Licensee Open Classes, Optional Packages等等

CLDC和JVM提供了多线程、锁定和同步、字节码执行、发放分派等等。一个单独的VM就是所有策略、命名和资源管理的范围。如果一个设备支持多个VM,那么每个VM都各自拥有自己的scope、naming和资源管理策略。MIDlet套件肯定不能(MUST NOT)拥有已经在CLDC和MIDP中定义过的类。

MIDP提供了实现了MIDP API的类。这些实现必须(MUST)保证应用程序程序员不能对这些系统保护的包进行重写、修改或添加。

一个单独的JAR文件包含了这个MIDlet的所有类文件。MIDlet程序可以加载和调用位于JAR文件、MIDP或者CLDC中的任何一个类。运行环境会用一个单独的空间来包容MIDlet套件中所有使用着的MIDlet、MIDP和CLDC类对象。在需要的时候,通用的Java锁定和同步原型应当(SHOULD)被用来
避免并行问题。每个类库将会特别说明它如何处理并行和MIDlet如何使用它来保证安全地运行在多线程的环境。

MIDlet的类文件只有在执行时可用,它既不能被作为资源来读取,也不能被提取来重用。该CLDC的实现会保存和解释任何适用的JAR文件内容。

JAR文件中非Java类文件的文件都可以用java.lang.Class.getResourceAsStream来访问。例如:manifest文件。

如果存在的话,可以用javax.microedition.midlet.MIDlet.getAppProperty方法来访问MIDlet描述文件。

MIDlet Suite Packaging
详细请看:http://java.sun.com/javame/reference/apis/jsr118/ 中MIDlet Suite Packaging一节。平常开发中,我们都用EclipseMe等工具来避免繁琐发咋的手动编译。

Application Lifecycle

每个MIDlet必须继承MIDlet类。该MIDlet类允许MIDlet的tarting, stopping,和cleanup。在application management software内,MIDlet可以请求获取来自应用程序描述文件(application descriptor)的参数。一个MIDlet套件必须不能有public static void main()方法,如果有,那也肯定会被application management software忽略。application management software提供了CLDC所需的初始化类,以此来启动一个MIDlet。

当一个MIDlet套件被安装在设备上,它的类、资源文件、参数和持久性存储信息会被保持在设备上待用。通过application management software,MIDlet对用户是可用的。

当MIDlet在执行时,一个MIDlet基础类的实例会被用无参数的构造器创建,并且通过它多样的状态来调用这个MIDlet的方法来序列MIDlet。MIDlet可以请求改变或通过MIDlet方法通知application management software这种改变。当MIDlet被application management software执行完成或者终止,MIDlet就会被销毁,它用过的资源会被回收,包括它创建的任何类和对象。MIDlet必须不能调用System.exit,如果该方法在一个MIDlet中被调用,则会抛出一个SecurityException。

Java类的正常状态不会被因为这些的加载而改变。引用到任意类都会导致它被加载,and the normal static initialization will occur。

MIDletStateChangeException 当应用程序状态无法改变时被抛出。

MIDlet lifecycle

MIDlet lifecycle定义了一个MIDlet和它所处环境之间的协议:

  * 一个简单的定义良好的状态机
  * 一个MIDlet状态的简明定义
  * 用于发送状态间变化的API

MIDlet Lifecycle Definitions

以下概念会在MIDlet Lifecycle中用到:

  * application management software: 设备软件操作环境的一部分,用来管理MIDlet。它维护MIDlet的状态并主导MIDlet的状态改变。

  * MIDlet: 设备上的MIDP应用程序。MIDlet可以发送给application management software有关它自己是否像运行或者已经完成的通知。一个MIDlet无法通过MIDlet API获知其它MIDlet的信息。

  * MIDlet States: 一个MIDlet可以拥有的状态是通过MIDlet接口认可的转换定义。对唯一的应用来说,更具体的应用状态是已知的。

MIDlet States

MIDlet状态机是被设计来确保一个应用程序的行为是一贯的并且尽可能的和设备制造商和用户所期望的相近,特别的:

  * 一个应用程序的启动延迟应该很短。
  * 把一个应用程序置入一个非活动的状态应该是可能的。
  * 任何时候结束应用程序应该是可能的。

有效的MIDlet状态是:

paused: MIDlet被初始化过并且处于静止。此时MIDlet应该不占有或者使用任何共享资源。通过以下情况导致进入该状态:
* MIDlet已经通过new创建。public无参高早起被MIDlet调用并且返回同事没有抛出一个异常。应用程序此时一般做很少的事情或者在这一步就没有初始化。如果发生一个异常,应用程序立即进入Destroyed状态并且被抛弃。

* 程序处于Active状态时,来自AMS(Application Management Software)的MIDlet.pauseApp()方法调用并且返回成功。

* 当调用MIDlet.notifyPaused()方法并且成功返回从Active状态转换。

* 当处于Active状态时的程序抛出一个MIDletStateChangeException时。

Active:  MIDlet处于正常运行。该状态这样进入:

* AMS调用MIDlet.startApp()方法的前夕。

Destroyed:  MIDlet释放了它的所有资源并终止。该状态这么进入:

* 当AMS已经调用MIDlet.destroyApp()方法并且成功返回,当无条件的参数为假并且一个MIDletStateChangeException被抛出的情况除外。destroyApp()方法会释放程序全部持有的资源并且执行任何必要的清理以便它可以被垃圾回收。

* 当对该应用程序的MIDlet.notifyDestroyed()成功返回。MIDlet必须在调用MIDlet.notifyDestroyed()之前已经进行了MIDlet.destroyApp()方法的等价行为。

注意:该状态只能被进入一次。

MIDlet状态转换图:



MIDlet Lifecycle Model

分享到:
评论

相关推荐

    javax.microedition.jar

    文件结构 javax/microedition/io/ javax/microedition/lcdui/ javax/microedition/midlet/ javax/microedition/rms/

    内存优化 解压

    MIDlet-Permissions: javax.microedition.io.Connector.http MIDlet-Description: MemoryUp Pro - Mobile RAM Booster (2009 Handango C hampionship Award - Best Phone Tool)由yueryo汉化分享

    JavaME+API

    javame的唯一参考手册。因唯一,故而可贵。...javax.microedition.midlet javax.microedition.pki javax.microedition.rms 可以一个不下,就是不能自贬身价,这是我们身为一个编程人员的自信和傲骨。

    J2me-listJ2me-list

    import javax.microedition.midlet.MIDletStateChangeException; public class ListMIDlet extends MIDlet implements CommandListener { private Display display; private List list; private Command getCmd;...

    俄罗斯方块J2ME代码

    import javax.microedition.midlet.MIDlet; import javax.microedition.lcdui.*; import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; import java.util.*; //import javax....

    J2ME分别显示四个图像

    import javax.microedition.midlet.MIDletStateChangeException; import javax.microedition.lcdui.Display; public class cbb extends MIDlet { public cbb () { // TODO Auto-generated constructor stub } ...

    MIDP API JavaME的核心API

    javaME的核心API , java.io java.lang java.util javax.microedition.io javax.microedition.lcdui javax.microedition.lcdui....javax.microedition.midlet javax.microedition.pki javax.microedition.rms

    笔试系统(二级C语言)

    import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.wireless.messaging.*; import java.io.IOException; import javax.microedition.io.*; public class Message extends ...

    j2me rms 通讯录

    import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class J2me4 extends MIDlet { private Display dis; public J2me4() { // TODO Auto-...

    J2ME制作简单的界面

    import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class Menu extends MIDlet { face FACE = new face(); public Menu() { } protected void ...

    javajishujishu

    import javax.microedition.midlet.MIDletStateChangeException; public class Text extends MIDlet implements ItemCommandListener,ItemStateListener { private static final TextField TextField = null; ...

    android视频

    import Midlet.Midlet; import Pic.GifDecoder; import java.io.IOException; import java.util.Random; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Image; import javax....

    Java版电子宠物游戏代码

    import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class Petgame extends MIDlet { private static Petgame instance; private PlayCanvas displayable = new PlayCanvas (); ...

    手机游戏,子棋游戏手机的象棋游戏

     import javax.microedition.midlet.MIDlet;  public class Game extends MIDlet {  GameCanvas game;//定义游戏界面的Canvas类GameCanvas的对象gobang  public Game() {  super();  game=new GameCanvas(this...

    手机游戏--五子棋算法

    自己写的一个很简单的五子棋算法,请大家指教哈 /*********WZQMIDlet.java*********/ ...import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException;

    j2me手机数据库 手机应用程序

    import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.rms.*; import java.io.*; import java.util.*; //公司员工类 public class recordData2 extends MIDlet ...

    《J2ME嵌入式开发案例精解》-源码

    import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class GIFMIDlet extends MIDlet implements CommandListener { private Display display; private Command exitCommand;//退出...

    Message.java

    import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.wireless.messaging.*; import java.io.IOException; import javax.microedition.io.*; public class Message extends ...

    BlackBerry 应用和MIDlet之间的交互

    javax.microedition.rms 包中可以找到必要的类和接口。Record Store 提供了打开,关闭,读取,写 入和更新操作,也提供方法删除单个记录或者整个存储。这个包包含接口来列举,排序和筛选 RMS 内容。 在MIDP1.0 时候...

    Eclipsemeddd

    接下来选择Package Expolrer,选择刚才新建的J2ME方案,然后通过New菜单,选择J2ME MIDP,单击Next.,出现输入MIDP类信息的对话框,该类默认从javax.microedition.midlet.MIDlet继承下来,所有MIDP的程序都需要从该类...

Global site tag (gtag.js) - Google Analytics