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

本文详细介绍了J2ME中的MIDlet生命周期及其三种状态:pause、active和destroyed。并通过一个简单示例展示了MIDlet如何在不同状态下进行转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

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

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

notifyPaused()实现的

MIDlet 有三个状态,分别是pauseactive 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");
            }

        }
 catch (IllegalArgumentException ex) {
            System.out.println(ex.getMessage());
        }
 catch (Throwable t) {
            
if (state.initialCommand == CommandProcessor.MANAGE) {
               state.runExceptionMessage 
=
                    Resource.getString(
"The application has unexpectedly " +
                    
" quit. Contact the application provider to resolve " +
                    
"the issue."+ " " + t.getMessage();
            }
 else {
                System.out.println(
"Exception caught in main:");
                t.printStackTrace();
                state.nextCommand 
= CommandProcessor.EXIT;
            }

        }


        saveCommandState(state);

        
/*
         * return any non-zero number so the native main can know that
         * this is graceful exit and not the power button on the phone.
         
*/

        exitInternal(CommandProcessor.MAIN_EXIT);
    }

这个是从j2me底层源代码上找到的,关于main入口方法的一段代码。由此可以知道,j2me也是有main方法的,只是sun公司帮我们做了很多事情,让我们的程序更好的开发与管理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值