<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    饒榮慶 -- 您今天UCWEB了嗎?--http://www.ucweb.com

    3G 手機開發網

       :: 首頁 :: 聯系 :: 聚合  :: 管理
      99 Posts :: 1 Stories :: 219 Comments :: 0 Trackbacks
    原文
    用一個簡單的例子來看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");
                }
            } 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公司幫我們做了很多事情,讓我們的程序更好的開發與管理。

    更加詳細的文章請看
    深入理解MIDlet類
    深入了解MIDP-基礎篇


    爬蟲工作室 -- 專業的手機軟件開發工作室
    3G視線 -- 專注手機軟件開發
    posted on 2007-05-09 08:40 3G工作室 閱讀(1493) 評論(2)  編輯  收藏 所屬分類: j2me 入門

    Feedback

    # re: 用一個簡單的例子來看MIDlet的生命周期 2007-05-09 09:18 JX
    朋友,這里會讓你動心的,過來看看

    大多數人都日復一日地重復著朝九晚五的生活,我們處于一種“做一天和尚撞一天鐘”的狀態,只是為了賺取按月計酬的工資--循規蹈矩工作,勤勤懇懇賺錢!這種生存方式,長久以來,禁錮著我們的頭腦!

      許多人都想通過網絡尋求更多的發展機會,互聯網為您展現了一個廣闊的空間,您可在其中尋求發展,實現自己的創業夢想!您的成功無需朝九晚五,這里每個人的機會都是均等的,您可在網絡世界里大展宏圖!

      耽誤您10分鐘時間,登陸我的網站:

      http://jx.cctve.cn
    QQ:79147981

      給我一次關注,回報您一個成功的機會!讓您的人生從此與眾不同、精彩紛呈!  回復  更多評論
      

    # re: 用一個簡單的例子來看MIDlet的生命周期 2007-05-09 22:44 二手車
    這個Blog不簡單啊。  回復  更多評論
      

    主站蜘蛛池模板: 精品久久久久久久免费人妻 | 亚洲人成在线中文字幕| 亚洲AV中文无码乱人伦| 欧美三级在线电影免费| 免费精品无码AV片在线观看| 一个人看的免费高清视频日本| 亚洲欧美国产日韩av野草社区| 亚洲精品在线不卡| 亚洲AV日韩AV高潮无码专区| 中文字幕不卡亚洲| 亚洲国产香蕉人人爽成AV片久久| 青青草国产免费久久久下载 | 亚洲福利一区二区| 国产精品亚洲精品日韩已满| 亚洲日本一区二区一本一道| 在线视频免费国产成人| 午夜一级免费视频| 国内自产少妇自拍区免费| 无码人妻久久一区二区三区免费丨| 222www免费视频| 免费观看男人吊女人视频| 抽搐一进一出gif免费视频| 羞羞视频在线观看免费| 免费的黄色的网站| 免费在线人人电影网| 美女羞羞免费视频网站| 羞羞视频免费网站入口| 国产精品亚洲色图| 国产亚洲视频在线观看| 黄色a三级三级三级免费看| 国产成人 亚洲欧洲| 免费精品视频在线| 免费一级毛片在线播放放视频| 免费人成在线观看播放a| 一级毛片大全免费播放下载| 一区二区三区视频免费观看| 成人片黄网站色大片免费观看cn| 成人无码精品1区2区3区免费看| 麻豆精品成人免费国产片| 97久久免费视频| 国产卡一卡二卡三免费入口|