Friday, August 17, 2007

對J2ME技術的基本概述以及體系結構介紹

發佈時間:2007.08.15 05:44 來源:賽迪網 作者:dxaw

隨 著行動通訊的突飛猛進,移動開發這個新鮮的字眼慢慢成為開發者關注的熱點。在網上進行的最近一份調查顯示,有24.34%的受訪者涉足嵌入式/移動設備應 用開發,這個數字可能略高於實際的比例,但也足可說明嵌入式/移動設備應用開發是一塊誘人的新鮮奶酪。J2ME(Java 2 Micro Edition)是嵌入式/移動應用平臺的王者,Linux和WinCE分列二、三位。Nokia等廠商力推的Symbian平臺目前開發者佔有率尚未達 到滿意水準,考慮到調查項合併了嵌入式設備(例如PDA)和移動設備(例如智慧手機),Symbian、WinCE系列在移動平臺上會是競爭的主要兩方。 如果廠商能在標準實現上做得更加規範,則J2ME的跨平臺特性會發揮得更加淋漓盡致,繼續保有王者地位。本章將從J2ME的體系結構和MIDlet應用程 式模型。

什麼是J2ME

學習J2ME以前知道什麼是J2ME是非常重要的。J2ME是SUN公司針對嵌入 式、消費類電子產品推出的開發平臺,與J2SE和J2EE共同組成Java技術的三個重要的分支。J2ME實際上是一系列規範的集合,由JCP組織制定相 關的Java Specification Request(JSR)併發布,各個廠商會按照規範在自己的產品上進行實現,但是必須要通過TCK測試,這樣確保相容性。比如MIDP2.0規範就是在 JSR118中制定的。可能接觸過J2ME的開發者會覺得說J2ME是一系列的規範不準確吧。因為我們在開發中用到了很多例如CLDC (Connected Limited Devices Configuration)和MIDP(Mobile Information Devices Profile)等內容。其實這並不矛盾,因為這些就是在相關規範中制定的。如果你還沒有很好的理解這個問題,沒有關係,請繼續往下面看,我們開始認識 J2ME平臺的體系結構。

J2ME平臺體系結構

J2ME平臺是由配置(Configuration)和簡表(Profile)構成 的。配置是提供給最大範圍設備使用的最小類庫集合,在配置中同時包含Java虛擬機。簡表是針對一系列設備提供的開發包集合。在J2ME中還有一個重要的 概念是可選包(Optional Package),它是針對特定設備提供的類庫,比如某些設備是支援藍牙的,針對此功能J2ME中制定了JSR82(Bluetooth API)提供了對藍牙的支援。

目前,J2ME中有兩個最主要的配置,分別是Connected Limited Devices Configuration(CLDC)和Connected Devices Configuration(CDC)。他們是根據設備的硬體性能進行區分的,例如處理器、記憶體容量等。由於這個標準是在2001年的時候指定的,而現 在移動終端的處理能力和記憶體容量發展很快,如果還按照這個標準來評判可能就不準確了。 因此我們只是列出標準,供讀者參考。本教程將主要講解基於 CLDC的J2ME平臺的相關內容。隨著技術和硬體設備的不斷發展,J2ME開發網將逐步推出基於CDC的J2ME平臺介紹。

CDC的硬體參數:

·2M以上記憶體。

·具有網路連接能力,通常為無線網路。

·需要實現java虛擬機規範的全部功能。

·32位或者64位的處理器。

CLDC的硬體參數:

·512 KB 以下記憶體

·有限能源供應(通常使用電池)

·有限或非持續網路連接

·簡單的用戶介面

·16位或者32位的處理器

從上述的標準中我們不難看出CLDC主要針對那些資源非常受限的設備比如手機、 PDA、雙工尋呼機等。而CDC主要面對那些家電產品,比如機頂盒、汽車導航系統等。簡表是以配置為基礎的,例如Mobile Information Devices Profile(MIDP)就是CLDC上層的重要簡表。與配置的縱向特性不同的是,簡表是橫向的。下圖是J2ME體系結構的框圖:

J2ME體系結構框圖

MIDlet應用程式的生命週期

理解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 unconditional)或者pauseApp()方法可以使得MIDlet進入destroyed或者pause狀態。值得一提的是 destroyApp(boolean unconditional)方法,事實上,當destroyApp()方法被調用的時候,AMS通知MIDlet進入destroyed狀態。在 destroyed狀態的MIDlet必須釋放了所有的資源,並且保存了數據。如果unconditional為false的時候,MIDlet可以在接 到通知後拋出MIDletStateChangeException而保持在當前狀態,如果設置為true的話,則必須立即進入destroyed狀態。 下圖說明瞭MIDlet狀態改變情況:

MIDlet狀態圖

下面通過一個例子來驗證MIDlet應用程式的生命週期:

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class HelloWorld extends MIDlet{
 private Display display;
 //構造函數

 public HelloWorld(){
  display = Display.getDisplay(this);
  System.out.println("Constructor");
 }

 public void startApp(){
  System.out.println("startApp is called.");
  Form f = new Form("HelloTest");
  display.setCurrent(f);
 }

 public void pauseApp(){
  System.out.println("pauseApp is called.");
 }

 public void destroyApp(boolean unconditional){
  System.out.println("destroyApp is called.");
 }
}

編譯該程式後運行,控制臺上就會依次輸出:

Constructor startApp is called.

當我們退出該程式時,控制臺就會輸出:

destroyApp is called.

對於詳細的生命週期問題,讀者可以查看其他教程籍或者本指南以後的更新的版本。

(責任編輯:龔勳)

No comments:

Post a Comment