`
wuhua
  • 浏览: 2118608 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

用一个简单的例子来看MIDlet的生命周期原文

阅读更多
原文
用一个简单的例子来看MIDlet的生命周期

用一个简单的例子来看MIDlet 的生命周期

想来估计也没有比网上教程说的更清楚了,我这里摘录的只是文字,从www.j2medev.com来获取,更详细的资料可以到www.j2medev.com上查看。我将会以一个例子跟查看官方的源代码来分析它们。

理解J2ME 的体系结构并不像想象的那么容易,我们觉得读更多的资料帮助也不大,我们

直接迈向J2ME 开发也许会对你理解J2ME 平台体系结构这个重要的概念有所帮助。在MIDP

中定义了一种新的应用程序模型MIDlet,它是被Application Management Software(AMS)管理

的。AMS 负责MIDlet 的安装、下载、运行和删除等操作。在被AMS 管理的同时,MIDlet 可

以和应用管理软件通信通知应用管理软件自己状态的变化,通常是通过方法notifyDestroyed()

和notifyPaused()实现的

MIDlet 有三个状态,分别是pause、active 和destroyed。在启动一个MIDlet 的时候,应用

管理软件会首先创建一个MIDlet 实例并使得他处于pause 状态,当startApp()方法被调用的时候

MIDlet 进入active 状态,也就是所说的运行状态。在active 状态调用destroyApp(boolean

第1 章 J2ME 技术概述

4

unconditional)或者pauseApp()方法可以使得MIDlet 进入destroyed 或者pause 状态。值得一提的

是destroyApp(boolean unconditional)方法,事实上,当destroyApp()方法被调用的时候,AMS 通

知MIDlet 进入destroyed 状态。在destroyed 状态的MIDlet 必须释放了所有的资源,并且保存了

数据。如果unconditional 为false 的时候, MIDlet 可以在接到通知后抛出

MIDletStateChangeException 而保持在当前状态,如果设置为true 的话,则必须立即进入destroyed

状态。下图说明了MIDlet 状态改变情况:

<!----><!----><!---->

 


看看我那个简单的例子
public class HelloWorld extends MIDlet ......{

    public HelloWorld() ......{ 
        System.out.println("这个是程序的构造函数,程序运行的时候首先调用这个");
    }

    protected void destroyApp(boolean unconditional)
            throws MIDletStateChangeException ......{
        System.out.println("这个是程序的destroyed事件,当您按下退出时调用");
    }

    protected void pauseApp() ......{
        System.out.println("这个是程序的pause事件,当您按下暂停的时调用");

    }

    protected void startApp() throws MIDletStateChangeException ......{
        System.out.println("这个是程序的active事件,程序启动时候调用");

    }

}

大家可以运行程序中看到这个程序的运行先后顺些。基本上就明白了程序的调用机制了。
现在大家思考下,j2me的MIDlet是怎么样运行的呢?sun在里面进行了什么样子的限制与手脚呢?
一般的应用程序都有个main入门。这里没有,为什么呢?
我想这个就是ASM的作用了,sun在后台做了很多处理,比如包括,启动容器,启动MIDlet相关的资源等等。

public static void main(String args[]) ...{
        CommandState state = new CommandState();

    /**//*
     * pass resource strings down to the native system menu and
     * popup choice group methods...
     */
    initSystemLabels();

        /**//*
         * We will try to handle any printing at this level, because
         * displaying JAM command line errors is device specific.
         */
        try ...{
            initializeInternalSecurity();

        /**//* Start a inbound connection watcher thread. */
        new Thread(new PushRegistryImpl()).start();

            restoreCommandState(state);

            // handle any development machine only functions at this level
            switch (state.nextCommand) ...{
            case CommandProcessor.RUN_CLASS:
                runLocalClass(state);
                state.nextCommand = CommandProcessor.EXIT;
                break;

            case CommandProcessor.MANAGE:
                manage(state);
                break;

            case CommandProcessor.LIST:
            case CommandProcessor.STORAGE_NAMES:
                list(state);
                state.nextCommand = CommandProcessor.EXIT;
                break;

            case CommandProcessor.REMOVE:
                if (DEV_STORAGE_NAME.equals(state.suiteStorageName)) ...{
                    removeDevStorage(state);
                    state.nextCommand = CommandProcessor.EXIT;
                    break;
                }

                // fall through
            default:
                CommandProcessor.perform(state);
                if (state.status == CommandProcessor.MIDLET_SUITE_NOT_FOUND) ...{
                    System.out.println("The MIDlet suite was not found.");
                } else if (state.initialCommand == CommandProcessor.INSTALL &&
                        state.status == CommandProcessor.OK) ...{
                    System.out.println("Storage name: " +
                                       state.suiteStorageName);
                }
            }
        } catch (InvalidJadException ije) ...{
            System.out.println("** Error installing suite (" +
                               ije.getReason() + "): " + 
                               messageForInvalidJadException(ije));
        } catch (IOException ioe) ...{
            System.out.println("** Error installing suite: " +
                               ioe.getMessage());
        } catch (ClassNotFoundException ex) ...{
            if (state.initialCommand == CommandProcessor.MANAGE) ...{

              state.runExceptionMessage =
                    Resource.getString("The application cannot be launched. " +
                    "One of the application classes appears to be missing. " +
                    "This could be due to a mis-named class. Contact the " +
                    "application provider to resolve the issue.");
            } else ...{
                System.out.println("MIDlet class(s) not found: " + 
                                   ex.getMessage());
            }
        } catch (InstantiationException ex) ...{
            if (state.initialCommand == CommandProcessor.MANAGE) ...{
               state.runExceptionMessage = Resource.getString(
                   "The application cannot be launched. The application " +
                   "may have done an illegal operation. Contact the " +
                   "application provider to resolve the issue.") + " " +
                   ex.getMessage();
            } else ...{
                System.out.println(
                    "MIDlet instance(s) could not be created: " + 
                                 ex.getMessage());
            }
        } catch (IllegalAccessException ex) ...{
            if (state.initialCommand == CommandProcessor.MANAGE) ...{
                state.runExceptionMessage = Resource.getString(
                   "The application cannot be launched. The application " +
                   "may have done an illegal operation. Contact the " +
                   "application provider to resolve the issue.") + " " +
                   ex.getMessage();
            } else ...{
                System.out.println(
                    "MIDlet class(s) could not be accessed: " + 
                    ex.getMessage());
            }
        } catch (OutOfMemoryError ex) ...{
            if (state.initialCommand == CommandProcessor.MANAGE) ...{
                state.runExceptionMessage = Resource.getString(
                    "The application has unexpectedly quit because it ran " +
                    "out of memory.");
            } else ...{
                System.out.println("The MIDlet has run out of memory");
   &nb
分享到:
评论

相关推荐

    MIDLet-Servlet通信

    在Java移动领域,MIDLet(Mobile Information Device Profile Application)是J2ME(Java 2 Micro Edition)平台上的一个应用程序接口,主要用于开发在小型设备如手机或掌上电脑上的应用程序。MIDLet与Servlet的通信...

    MIDlet控件实例项目(mvc)

    该项目是一个基于Eclipse的MIDlet应用程序示例,其核心目标是演示如何在Java 2 Micro Edition (J2ME) 平台上使用MIDlet控件。MIDlet是J2ME中的一个关键概念,它是一个可下载的移动应用单元,能够在小型设备如手机或...

    Midlet2.rar_midlet_simple

    【描述】"this is simple example of j2me midlet by using lwuit library in which simple form is displayed" 描述了一个基本的J2ME MIDlet示例,这个示例使用了LWUIT库来展示一个简单的表单。在这个场景中,...

    深入MIDP2.0(1) - 谈生命周期与安全性

    MIDlet Suite是包含一个或多个MIDlet的集合,它们共享资源并一起打包成JAR文件。MIDlet Suite的定义在MIDlet-Jar-URL和MIDlet-1等属性中指定,这些属性在JAD文件中定义。 3. **安全性**: MIDP 2.0引入了更强大的...

    J2ME开发资料整理-在MIDlet中使用图标(附范例)

    以下是一个简单的例子,展示了如何加载并显示图标: ```java import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class IconTestMIDlet extends MIDlet { private Display display;...

    midlet_servlet.rar_midlet-servlet

    标题中的"midlet_servlet.rar_midlet-servlet"暗示了这是一个关于Java ME(Midlet)与Servlet交互的项目。在移动设备(如早期的智能手机)上,Java ME(Micro Edition)提供了一个名为Midlet的框架,用于开发移动...

    RMS-MidLet例子

    在这个"RMS-MidLet例子"中,我们关注的是如何使用RMS来创建一个基于J2ME的Midlet应用程序。Midlet是运行在J2ME环境下的移动应用程序,它在功能手机上扮演着类似Android或iOS应用的角色。这个示例项目将展示如何在...

    Midlet Signing

    假设我们正在为一款MOTO手机开发一个简单的Midlet应用。下面简要介绍如何利用`jarsigner`工具完成签名过程: - **步骤一**: 生成证书文件。 ```bash keytool -genkey -v -keystore my-release-key.keystore -...

    midlet2.zip_png

    标题“midlet2.zip_png”暗示这可能是一个与Java MIDP(Mobile Information Device Profile)相关的压缩文件,MIDP是Java Micro Edition(Java ME)的一部分,用于开发移动设备上的应用程序,尤其是早期的智能手机和...

    读取MIDlet的系统属性

    首先,让我们看一个简单的示例代码,该代码创建了一个名为`DetectMIDlet`的MIDlet,它展示了一些关键的系统属性: ```java import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class...

    MIDlet-Test.zip_midi_midlet

    在移动设备上开发应用程序,尤其是早期的Java ME(Mobile Information Device Profile)平台,开发者常常使用MIDlet来创建可运行在手机上的小程序。MIDlet是Java Micro Edition(Java ME)的一部分,它允许开发者为...

    黑莓MIDlet开发指南

    1. **项目创建**:在集成开发环境中新建一个MIDlet项目。 2. **UI设计**:根据需求设计用户界面,可以使用AWT/SWT组件库或自定义组件。 3. **功能实现**:编写业务逻辑代码,实现所需的功能模块。 4. **调试与测试**...

    j2me_MIDlet_手机游戏入门开发_俄罗斯方块

    总的来说,通过这个简单的J2ME俄罗斯方块项目,初学者可以深入理解移动游戏开发的核心概念,包括MIDlet的生命周期管理、图形编程、用户输入处理以及资源优化。同时,这也是一个很好的实践机会,帮助你从理论到实践,...

    MIDlet通过蓝牙与电脑通信的案例

    一旦找到目标设备,我们使用`Connector.open()`方法创建一个流连接。例如,`Connector.open("btspp://&lt;device_address&gt;:;authenticate=true;encrypt=false")`会打开一个与指定地址和UUID(通用唯一标识符)的蓝牙...

    新建第一个J2me程序----低级UI绘制的Hello MIDlet

    在本文中,我们将深入探讨如何使用Java 2 Micro Edition(J2ME)创建你的第一个低级用户界面(UI)绘制的“Hello MIDlet”程序。MIDlet是J2ME平台上的应用程序,它允许在移动设备和嵌入式系统上运行。我们将遵循一个...

    Java手机程序设计入门9

    **MIDlet的生命周期**:MIDlet在其整个生命周期中会经历三个主要状态:启动(`startApp()`), 暂停(`pauseApp()`)和销毁(`destroyApp()`)。这些状态的变化由`Java Application Manager (JAM)`控制,当MIDlet的状态...

    HelloMIDlet.rar_in

    总结起来,《HelloMIDlet.rar_in》是一个学习和实践J2ME开发的起点,尤其是对于初学者,通过这个简单的MIDlet,可以理解J2ME平台的基本结构、MIDlet生命周期以及如何创建基本的用户交互。通过深入研究和扩展这个例子...

    JAVA游戏编程之二----j2me MIDlet 手机游戏入门开发--贪吃蛇_1_工程代码

    总的来说,通过学习这个"JAVA游戏编程之二----j2me MIDlet 手机游戏入门开发--贪吃蛇"项目,你可以掌握到J2ME基础,包括MIDlet的生命周期管理、图形绘制、事件处理、动画制作以及简单的游戏逻辑。这个过程不仅可以...

Global site tag (gtag.js) - Google Analytics