程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> J2ME無線通信編程入門

J2ME無線通信編程入門

編輯:J2ME
隨著支持Java軟件的手機問世,開發應用於手機上的程序已經不再是夢想。本文將向讀者介紹如何利用J2ME開發手機及移動設備的應用程序。

  一、基礎篇:J2ME體系結構詳解
  1. 什麼是J2ME
  J2ME即JAVA 2 Micro Edition,它是Java 2的組成部分,與J2SE、J2EE並稱。J2ME是一種高度優化的Java運行環境,應用於大量的消費類電子設備,如Cellular Phones(蜂窩電話)、Screen Phones(可視電話)、Digital Set-top Boxes(數字機頂盒)、Car Navigation Systems(汽車導向系統)等,同時也廣泛被移動通信設備所采用,如移動電話、雙向尋呼機、智能卡、個人電腦記事本(Personal Organizer)和掌上電腦(Palmtop)等。J2ME技術將Java語言的與平台無關的特性移植到小型電子設備上,允許移動無線設備之間共享應用程序。

  2. J2ME體系結構和配置
  (1)J2ME體系結構

  J2ME體系結構基於設備的系列和類別,一個類別定義了一個特定種類的設備。移動電話、尋呼機和個人電腦記事本都是單獨的類別。對存儲器和處理能力有相近需求的若干類別的設備構成設備的一個系列。移動電話、尋呼機和個人電腦記事本一起就是占用資源很小的設備的一個系列。圖1定義了在J2ME環境中設備的系列和類別之間的關系。

  另外,為了支持資源受限設備所要求的那種靈活性和可定制部署,人們將J2ME體系結構設計成模塊化和可伸縮。J2ME技術在一個完整的應用程序運行模型中定義了這種模塊性和可伸縮性,在該模型中的4個軟件層都構建在設備的主機操作系統上。J2ME的體系結構如圖2所示。

  Java 虛擬機層(Java Virtual Machine Layer):是Java虛擬機的一個實現,它是為特定設備的主機操作系統定制的,而且支持特定的J2ME配置(Configuration)。

  配置層(Configuration Layer):配置層定義了Java虛擬機功能上和特定類別設備上可用的Java類庫的最小集。從某種程度上說,一個配置定義了Java平台功能部分和庫的共同性,開發者可以假設這些功能部件和庫在屬於某一特定類別的所有設備上都是可用的。

  框架層(Profile Layer):框架層定義了特定系列設備上可用的應用程序編程接口(API)的最小集。框架在一個特定的配置上實現。應用程序是針對特定框架編寫的,因此可以移植到支持該框架的任何設備上。一個設備可以支持多個框架。用戶和應用程序供應商看到最多的就是這一層。

  MIDP(Mobile Information Device Profile)層:移動信息設備框架。是Java API集合,它處理諸如用戶界面、持久存儲和聯網等問題。

  (2) J2ME配置

  由上可知,J2ME組件都圍繞一個中心,這些中心被稱為“配置”(Configuration)。它們用於消費電子和嵌入設備的特別的類。目前J2ME定義2個“配置”,這2種“配置”由於其處理運算的能力不同而支持不同的設備對象。

  Connected Limited Device Configuration(CLDC,有限連接設備配置):該“配置”定義Java應用程序接口以及支持手持設備的技術。如手機、掌上電腦等。

  Connected Device Configuration(CDC,連接設備配置):該“配置”支持“插入牆”式設備的應用程序接口,如機頂盒等。

  上述兩種“配置”,其區別在於它們應用於的設備的能力:

  CLDC設備的處理器能力有限(與台式機比較),且存儲器大小一般只在128KB到512KB之間,而CDC系統則不同,它可能有32位或64位處理器,以及有限的存儲容量,不過它的下限也超過512KB。它們共同所遵循的原則是,每個不同功能的硬件設備都將被不同的虛擬機支持。

  3. J2ME的簡表
  雖然,“配置”為一組通用設備提供了最小的Java平台,但是開發者感興趣的是為個別設備設計應用程序,當他們只使用“配置”進行開發,那麼所編寫的應用程序肯定會有所欠缺。“配置”必須滿足所有設備的最小要求,而用戶界面、輸入機制和數據持久性都具有高度的設備具體性,每一種設備都有自己的方法,這些往往不在“配置”所能滿足的最小要求范圍之內。

  現在,5個已知簡表已經有了規范。而每個簡表的責任都是為了完善配置的不足。

  (1)MIDP簡表

  MIDP(Mobile Information Device Profile,移動信息設備簡表)是第一個實現的簡表,它補充了CLDC配置,並且提供應用程序語義和控件、用戶界面、持久存儲器、網絡和用於移動電話的計時器、雙通道呼叫器和其他無線電設備。

  (2)PDA簡表

  Palm公司是開發PDA簡表規范的領頭人,該簡表完善了CLDC配置,在相當長的時間內,它都將是KJava類程序包的替代品。Java規范建議該簡表至少應當提供2個核心功能片段,即用戶界面顯示工具包,適合於“有限的尺寸和深度顯示”,另一個則是持久數據存儲器機制。顯示工具包應該是抽象窗口工具包的一個子集,而持久機制將為應用程序、數據、配置/環境信息提供簡單的數據存儲。

  (3)Foundation簡表

  Foundation簡表的任務是擔任一個基礎簡表,便於以後開發出來的提供圖形用戶接口、 網絡等功能的簡表附著在它之上。除了用於基礎簡表,Foundation簡表還提供完整網絡的支持,不管有沒有使用圖形用戶接口。

  (4)Personal簡表

  在當前規范的需求下, Personal簡表提供下一代Personal Java環境。該簡表允諾,提供互聯網連接性和Web保真度以及一個能夠運行Java Applets的GUI。

  (5)RMI簡表

  我們知道CDC配置為共享的、固定網絡連接信息設備提供最小的Java環境。該簡表將通過提供Java到Java的RMI來協助提供更好的網絡連接性。

  二、入門篇:MIDP簡表應用實例
  前面我們介紹了J2ME的基礎知識,同時也提到了MIDP簡表的作用。現在我們來看看如何利用J2ME與MIDP開發應用程序。

  注意:遵照MIDP簡表和CLDC配置規范編寫的Java應用程序,我們稱其為MIDlet。

  1.MIDP/CLDC API概述
  由於MIDP/CLDC API將在一個性能有限的設備上運行,因此Java的一些功能被移除或者修改。

  (1)MIDP的類庫

  如上所述,SUN在CLDC配置之上定義了MIDP層,用以提供對用戶界面(User Interface,UI)、永久存儲介質(Persistinace Storage)和網絡等支持。下面,我們來看看MIDP的類庫。

  MIDP由四個Javax.microedition包組成,包括:

  Javax.microedition.rms:關於永久存儲介質(rms即Record Management System)。

  Javax.microedition.midle:定義了MIDlet的框架,以及MIDlet與環境的交互。

  Javax.microedition.io:提供網絡支持。

  Javax.microedition.lcdui:關於用戶界面(UI分為High Level和Low Level兩種API)。

  (2)構件

  MIDP簡表和CLDC配置組合起來,為創建移動電話和簡單雙向尋呼機上的應用程序提供了完整的開發環境。

  MIDP框架的核心是一個MIDlet應用程序。這個應用程序繼承了MIDlet類,以允許應用程序管理軟件對MIDlet進行控制、從應用程序描述檢索屬性以及對狀態變化進行通知和請求。所有MIDlet都繼承MIDlet類──運行時環境(應用程序管理器)和MIDlet應用程序代碼之間的接口。MIDlet類提供了用於調用、暫停、重新啟動和終止MIDlet應用程序的API。應用程序管理軟件可以在運行時環境內管理多個MIDlet的活動。此外,MIDlet可以自己發出一些狀態變化,並把這些變化通知給應用程序管理軟件。

  MIDP API類的完整集合可以分為兩個類別:

  用於用戶界面的MIDP API:設計這些API是為了能以一系列屏幕顯示為基礎,與用戶進行交互操作,每一屏幕顯示適量的數據給用戶。這些API允許應用程序決定下一屏顯示什麼、執行什麼、計算和使用網絡服務的何種請求。

  用於處理數據庫的MIDP API:這些API負責組織和操作設備數據庫,這個數據庫由在MIDlet的多個調用之間跨越時保持持久的信息組成。底層的CLDC API用於處理字符串、對象和整數。還提供了Java 2 API的一個子集,用於處理I/O和網絡通信。

  (3)用戶界面設計(UI)

  MIDP API盡管維護的是一個受限的框架,但它還是提供了用戶界面元素的完整集合。以下是最重要的UI元素:

  Alert:用於在屏幕上顯示異常情況或錯誤的信息。

  Choice:用於實現從既定數量的選項中進行選擇。

  ChoiceGroup:提供一組相關選項。

  Form:作為其用戶界面元素的容器。

  List:提供一個選項列表。

  StringItem:只顯示字符串。

  TextBox:允許用戶輸入和編輯文本的屏幕顯示。

  TextField:允許用戶輸入和編輯文本。多個TextFIEld可放到一個Form中。

  DateField:是一個可編輯的組件,用於表示日期和時間信息。DateFIEld可以放到Form中。

  Ticker:用於文本的可滾動顯示。

  (4) 設備數據庫管理

  MIDP簡表提供了一組用於組織和操作設備數據庫的類和接口:RecordStore、RecordComparator和RecordFilter。RecordStore由大量的記錄組成,這些記錄在MIDlet的多個調用之間跨越時保持持久。對RecordStore中的記錄進行比較,或者從RecordStore中抽取若干組記錄,都是RecordComparator和RecordFilter接口提供的功能。

  2. 配置編程環境
  與其他編程語言不同,在開發一個J2ME程序之前首先要配置好J2ME編程環境。

  (1)軟件准備

  在開發一個MIDlet之前,需要下載:

  Java Development Kit(JDK),1.2版本以上。

  Connected, Limited Device Configuration(CLDC)。

  Mobi

首 頁 | 新 聞 | Symbian | Android| Windows Mobile | J2ME | 下載中心 | 游戲策劃 | 招聘與求職 | 購書指南 | 視頻教程 您現在的位置: 開發視界 >> J2ME >> J2ME入門 >> 正文 J2ME無線通信編程入門 作者:尹華成    文章來源:轉載    更新時間:2007-2-7 11:05:17 3538 le Information Device Profile(MIDP)。

  (2)軟件安裝

  JDK安裝:JDK已經默認了用於安裝文件的目錄,當然你也可以選擇安裝在一個你自己選定的路徑。如E:\jdk1.3。

  安裝CLDC配置:將下載到CLDC軟件解壓到硬盤,筆者推薦路徑為E:\j2me。解壓以後,E:\J2ME路徑的結構如下所示:

  E:\J2ME

   |

  J2ME_cldc

  安裝MIDP簡表:同上,解壓MIDP軟件到硬盤目錄E:\J2ME,現在該目錄結構如下所示:

  E:\J2ME

  |

  J2ME_cldc

  midp-fcs

  (3)配置軟件

  PATH環境變量是Windows操作系統用來定位可執行程序的,我們需要更新PATH來指向Java編譯程序和CLDC、MIDP程序的路徑。

  更新JDK的PATH:如果是在Windows NT/2000環境中,請在控制面板中雙擊“系統”圖標,在出現的對話框中單擊“高級”選項卡,單擊“環境變量”按鈕,在出現的對話框中“系統變量”列表中找到並雙擊PATH,在出現的對話框中的“變量值”的末尾添加JDK安裝路徑的\bin目錄。假設你安裝JDK是1.3版本並選擇默認安裝路徑,本例為E:\jdk1.3。如果是在Windows 98環境中,請在C:\Autoexec.bat文件的最後加上以下兩行即可。

  set path= E:\jdk1.3\bin;%path%

  set classpath=.;

  更新CLDC路徑:你還需要更新你的PATH環境變量來指向存放CLDC可執行文件的目錄。按照上面講述的相同步驟添加到PATH中:

  E:\j2me\J2ME_cldc\bin

  更新MIDP路徑:更新PATH環境來指出存放MIDP可執行文件的目錄,該文件是用於測試MIDlet的移動電話模擬器。

  按照上面講述的步驟添加到PATH中,這裡是E:\J2ME\midp-fcs\bin。

  下面讓我們來更新CLASSPATH環境變量。CLASSPATH告訴Java編譯程序到什麼地方搜索那些不是JDK平台本身附帶的類庫,在本例中,我們需要更新CLASSPATH來指向MIDP類。你還需要有當前目錄的引用("."),作為CLASSPATH的一部分,按照上面概述的相同的步驟,更新CLASSPATH: CLASSPATH=e:\J2ME\midp-fcs\classes;。

  注意:最後的點“.”表示當前的工作目錄。

  最後,讓我們來添加SCREEN_DEPTH環境變量。MIDP含有一個測試MIDlet用的移動設備模擬器,這個模擬器可以以有色模式運行,也可以運行於黑白兩色構成的灰度梯度模式。為了指定顏色數,你可以添加環境變量 SCREEN_DEPTH。如CREEN_DEPTH=8。添加該環境變量與處理PATH和CLASSPATH變量的方法類似。

  下表中給出了SCREEN_DEPTH值和顏色的對應關系。


顏色數

顏色數

1
2
2
4

4
16
8
256

  3. 編寫代碼
  現在我們編寫“Hello World!”應用程序來了解J2ME程序的結構及編寫方法,在這裡,程序名是HelloJ2ME,程序代碼如下:

  import Javax.microedition.midlet.*;

  import Javax.microedition.lcdui.*;

  public class HelloJ2ME extends MIDlet implements CommandListener

  {

    private Display display;

  private TextFIEld tfHello;

  private Command cmExit;

  private Form fmMain;

   public HelloJ2ME()

   {

  display = Display.getDisplay(this);

     //創建主窗體

   fmMain = new Form("HelloJ2ME");

     //創建“Exit”按鈕

   cmExit = new Command("Exit", Command.SCREEN,1);

     //創建一個可以容納15個字符的文本單行

   tfHello = new TextField("Text","Hello World!",15,TextFIEld.ANY);

     //把控件增加到主窗體

     fmMain.addCommand(cmExit);

   fmMain.append(tfHello);

   fmMain.setCommandListener(this); 

   }

  正如我們所看到的那樣,HelloJ2ME程序擴展了MIDP基本應用程序MIDlet類,並導入了兩個包名稱空間:javax.microedition.midlet和Javax.microedition.lcdui。前者包括該應用程序的MIDlet基類,而後者則提供了一組類似Swing的GUI元素供應用程序使用。

  MIDlet類提供了3種抽象方法供設備應用程序管理器與其運行的應用程序通訊。只要應用程序被激活、構造器執行完畢之後就會立即調用startApp方法,而不是在應用程序最初啟動時就這樣做。應用程序在一次運行過程中會在活動和不活動狀態之間多次轉變,這樣你就不必編寫單獨運行的初始化代碼了,因為這類代碼很可能會執行好多次。為此應該采用構造器來完成同一功能。

  管理器指示應用程序關閉之後就會調用destroyApp方法。和startApp方法不一樣的是該方法只在應用程序生存期內調用一次,所以在這個方法內編寫清除代碼是很安全的。實際上,由於MIDP並沒有為對象包括finalize函數,所以你不得不在以上方法處執行清除功能。同時,由於典型的移動設備比通常情況下的標准平台欠缺穩定,經常被用戶進行開關機或者復位操作。所以你也不能真正指望destroyApp派上大用場。

  最後的抽象方法就是pauseApp了。該方法主要作用是發出這樣的通知。因為用戶轉換到其他應用或者采用了設備的某項功能促使應用程序不能繼續運行而暫時停止應用程序的運行。由於大多數移動設備都缺乏執行多任務的處理能力,以上的這類情況是完全可能發生的。所以在這個方法中應該編碼釋放所有資源。一旦應用程序重新開發運行則應用程序管理器會再度調用startApp方法。

  三、進階篇:無線消息傳送系統分析
  針對手機軟件的特殊性,我們有必要了解“無線消息傳送”的基本原理。下面我們將重點為大家介紹幾種常用的無線消息服務方式。

  1.GSM短信服務與小區廣播服務
  無線消息傳遞的思想為J2ME開拓了全新的前景。由無線消息傳遞支持的J2ME應用程序能獨立於平台來訪問無線通信資源,如全球移動通信系統(Global System for Mobile Communication,GSM)網絡(一種允許跨國通信的移動電話系統)的短信服務(SMS)和小區廣播服務(CBS)。

  (1)GSM 短信服務(SMS)

  SMS是GSM網絡中移動電話、傳真機與IP地址之間簡短文本消息的傳遞。所傳遞的消息不得超過160個字母、數字字符,且不包含圖像或圖形。這一服務的主要特性是迅速、價廉並能保證消息會到達目標用戶。

  消息一經發送,就會由短信服務中心(SMSC)接收,該中心必須隨即將消息發送到適當的移動設備。為了做到這一點,SMSC會向歸屬位置寄存器(Home Location Register,HLR)發送SMS請求以找到漫游用戶。一旦HLR接收到該請求,就會以用戶的狀態(如1.不活動或活動,2.漫游位置)來響應SMSC。如果響應為不活動,則SMSC將保留消息一段時間。當用戶使用其設備時,HLR會向SMSC發送一個SMS通知,而SMSC則嘗試進行發送。

  SMSC以短信發送點對點(Short Message Delivery Point-to-Point)格式將消息發送到GSM消息發送系統。該系統會尋呼設備,若設備做出響應,則發送消息。同時,SMSC會收到驗證,即消息已經由最終用戶接收,然後將該消息歸類為已發送,並且將不再嘗試發送它。

  (2)GSM小區廣播服務

  GSM小區廣播服務允許將消息發送到當前位於某個特定小區的每個移動台(Mobile Station,MS),如移動電話、傳真機和IP地址。在一段時間內重復小區廣播消息,從而使在第一次發送之後才進入小區的MS也能接收到消息。可以用二進制數據或ASCⅡ文本的形式最多發送15頁的數據,每頁最多有93個字符,測試裝置僅提供對ASCⅡ消息的支持。小區廣播消息按主題分類,給每條消息都分配了通道號、消息代碼、更新號和語言。

  通道號:標識消息主題的頭部號(如'氣象報告'或'交通信息')。

  消息代碼:標識特定的消息,這樣當MS收到的消息代碼與以前收到的相同時,會意識到這是一條重復消息,就會不顯示給用戶。

  更新號:用來標識消息的特定版本。

  語言:指明消息所用的語言。更改此參數不會使消息的原文得到翻譯。

  2. 無線消息傳送系統解析
  簡單地講,我們可以把一個無線消息傳送系統看作一個三層體系結構,由接口層(Interface Layer)、實現層(Implementation Layer)和傳輸層(Transport Layer)組成。

  接口層構成了一組通用的消息傳遞接口,它們獨立於所有消息傳遞協議。這些接口提供消息的基本定義,定義發送和接收消息的基本功能,以及提供向MIDlet應用程序通知進入消息的機制。

  實現層包含這樣的類,它們實現每個接口層以訪問無線消息傳遞,如GSM移動設備上的SMS或CBS功能。例如,就SMS而言,這一層提供了用於SMS消息的消息連接實現,以及具有文本或二進制屬性的SMS消息的實現。實現層還執行用於底層協議的消息分段和並置。然後,MIDlet可以在MessageConnection中指定應該將某條消息拆分成幾段。

  傳輸層包含這樣的類,它們實際實現了將消息傳送到移動設備的協議。

  3.通用消息傳遞API──Javax.wireless.messaging

  此API由Javax.wireless.messaging包定義,該包定義了所有用於發送和接收無線消息

首 頁 | 新 聞 | Symbian | Android| Windows Mobile | J2ME | 下載中心 | 游戲策劃 | 招聘與求職 | 購書指南 | 視頻教程 您現在的位置: 開發視界 >> J2ME >> J2ME入門 >> 正文 J2ME無線通信編程入門 作者:尹華成    文章來源:轉載    更新時間:2007-2-7 11:05:17 3536 的接口。

  Message:提供消息的基本定義,充當一個容器來容納消息的地址、有效負載及關於發送和阻塞的標志。它是TextMessage和BinaryMessage的超接口(Super Interface),後兩個分別是帶文本有效負載屬性和帶二進制有效負載屬性的消息對象。Message的結構如圖3所示。

  MessageConnection:提供接收和發送消息的基本功能。它包含一個發送和接收消息的方法、一個創建新Message對象的工廠(Factory)方法和一個計算發送某指定Message對象所需底層協議段數量的方法。

  通過調用 Connector.open()可將這個類實例化。

  在客戶機方式連接中,只能發送消息。通過將標識目的地址的字符串傳遞到 Connector.open()方法來創建客戶機方式連接。該方法返回MessageConnection對象。

  clIEntConn=(MessageConnection)Connector.open("sms://+18643630999:5000");

  在服務器方式連接中,可以發送或接收消息。通過將標識本地主機上端點(取決於協議的標識符,例如,端口號)的字符串傳遞給Connector.open()方法來創建服務器方式連接。

  serverConn =(MessageConnection)Connector.open("sms://:5000");

  MessageListener:它提供了向MIDlet應用程序通知有進入消息的基本機制。當可以讀取新到消息時,它允許MIDlet接收一個回調。

  (1)短信服務API

  J2ME的com.sun.midp.io.J2ME.sms包提供了用於短信服務消息傳遞系統的API,並允許MIDlet訪問GSM移動設備上的SMS功能。

  該包主要包括MessageObject和Protocol兩個主要組件,用於支持SMS消息的發送和接收。

  MessageObject:用於SMS消息實現。

  在實現層,Javax.wireless.messaging.Message接口是作為緩沖區實現的。MessageObject處理消息緩沖區的創建和緩沖區之外的輸入/輸出操作。此外,它有兩個子類,即TextObject和BinaryObject。這些類實現具有文本或二進制有效負載的SMS消息。

  Protocol:它實現發送SMS消息所需的與低層傳輸(Transport)機制的消息連接。在這一過程中,它檢查所有的運行配置參數,並處理與無效URL語法、安全性違規、I/O違規和無效參數有關的異常。Protocol還處理使用數據包或串行端口連接的消息發送與接收。

  (2) 小區廣播消息傳遞API

  J2ME的com.sun.midp.io.J2ME.cbs包提供用於小區廣播消息傳遞系統的API,並允許MIDLlet訪問GSM移動設備上的CBS功能。

  該包的主要組件com.sun.midp.io.J2ME.cbs.Protocol支持CBS消息的接收。CBS與SMS的不同之處在於,URL連接字符串不支持指定的主機,而且它僅用於入站協議。有CBS能力的MIDlet可接收消息,但不能發送它們。

  四、實例分析篇:一個J2ME消息傳遞應用程序
  下面我們通過分析一個示例程序WMAServer來介紹J2ME是如何實現消息傳送的?示例程序的主要功能是:等候進入的SMS消息,然後將它們顯示在電話屏幕上。Javax.microedition.lcdui包提供了一組功能,用於實現應用程序的用戶界面。

  WMAServer MIDlet通過將標識本地主機上端點(取決於協議的標識符,例如端口號)的字符串傳遞給Connector.open()方法來創建服務器方式連接。為了能收到進入消息的通知,MIDlet在MessageConnection實例serverConn處注冊一個MessageListener對象。

  serverConn.setMessageListener(MessageListener ml);

  它還在MessageListener接口中實現notifyIncomingMessage()。當進入消息到達 MessageConnection時,就調用notifyIncomingMessage()方法。應用程序必須使用 MessageConnection的receive()方法來檢索該消息。

  WMAServer應用程序從進入消息讀取文本或二進制的有效負載數據,然後將其存儲在字符串對象中供以後顯示。

  public void notifyIncomingMessage(MessageConnection conn) {

  Message msg = null;

  // Try reading (maybe block for) a message

  try {

    msg = conn.receive();

  }

  catch (Exception e) {

    // Handle reading errors

    System.out.println("processMessage.receive " + e);

  }

  // Process the received message

  if (msg instanceof TextMessage) {

    TextMessage tmsg = (TextMessage)msg;

    msgReceived = tmsg.getPayloadText();

  }

  else

  {

    // process received message

    if (msg instanceof BinaryMessage) {

     BinaryMessage bmsg = (BinaryMessage)msg;

     byte[] data = bmsg.getPayloadData();

     // Handle the binary message...

    msgReceived = data.toString();

   }

  }

  當必須釋放連接資源和相關聯的偵聽器對象時,應用程序提供destroyApp()方法。

  public void destroyApp(boolean unconditional){

   try {

    if(serverConn != null){

    serverConn.setMessageListener(null);

    serverConn.close();

    }

  }

  Catch(IOException e){

    //Handle the exception...

    e.printStacktrace();

  }

  五、實踐篇:編寫“捕捉鍵盤輸入的ASCⅡ碼”程序
  通過前面的介紹,我們對J2ME已經有了一個直觀的認識。下面我們將通過編寫一個具體的實例程序,來進一步說明J2ME編寫手機應用程序的方法。本例程序應用於摩托羅拉388手機,例程完成後,將捕捉鍵盤輸入的ASCⅡ碼。

  1. 關於開發工具
  MotoJ2SDK是摩托羅拉388手機定制的命令行開發工具包,其中集成的開發環境包括有CodeWarrior、JCreator等。

  無線手持設備(MDIP)簡易開發工具包(MDIP的安裝方法前文中已有介紹)。

  Java 2 SDK 1.3是必備的,它提供開發、測試和運行Java程序的平台(安裝方法見前文)。

  開發環境筆者推薦使用JCreator。

  2. JCreater+MotoJ2SDK的配置與使用
  這是必須而且是極其重要一步,如果配置不正確,你的程序將無法運行。我們假設所有開發工具的安裝路徑如下:

  JCreator:D:\Program Files\Xinox Software\JCreator LE

  MotoJ2SDK:D:\Motoj2sdk

  JDK:D:\jdk1.3.1

  開始配置之前,我們首先要激活模擬環境。運行D:\MotoJ2SDK\generic\scripts\runConstructor.bat,並正確選擇手機型號、選擇語言、選擇Normal,最後點擊“創建”即可。完成以上工作後,我們就可以進行配置了。

  第一步,選擇Configure→Options→JDK Profiles。

  注意:一定新建profile and select“D:\jdk1.3.1”。

  將該名字更改為“J2ME 388”;Add classes path更改為“D:\Motoj2sdk\lib”;Add documentation path更改為“D:\Motoj2sdk\docs”。

  第二步,選擇 Configure→Options→JDK Too

首 頁 | 新 聞 | Symbian | Android| Windows Mobile | J2ME | 下載中心 | 游戲策劃 | 招聘與求職 | 購書指南 | 視頻教程 您現在的位置: 開發視界 >> J2ME >> J2ME入門 >> 正文 J2ME無線通信編程入門 作者:尹華成    文章來源:轉載    更新時間:2007-2-7 11:05:17 3537 ls。

  選擇ComplIEr,選中And Edit It項,將parameters更改為“-O -bootclasspath D:/motoj2sdk/lib $[JavaFiles]”。

  第三步,選擇Configure→Options→Tools。

  單擊“New”按鈕,選擇DOS command新建一個名字為“Preverifier”的DOS command,並將arguments更改為“d:\Motoj2sdk\bin\preverifIEr.exe -classpath "d:\Motoj2sdk\lib" -d . .”;將initial directory更改為“$[PrjDir]”。

  第四步,按上面的方法在新建一個名字為“Run Emulator”的DOS command。

  將arguments更改為“java–D java.library.path=d:/MotoJ2SDK/lib -classpath "d:/MotoJ2SDK/bin/Emulator.jar";"d:/MotoJ2SDK/ConfigTool.jar" com.mot.tools.J2ME.emulator.Emulator -classpath$[PrjDir];"d:/MotoJ2SDK/lib" –deviceFiled:/MotoJ2SDK/bin/resources/device.props Javax.microedition.midlet.AppManager $[CurClass] -JSA 1 1"

  將initial directory 更改為 “d:\Motoj2sdk\bin”。

  第五步,同樣按照上面的方法新建一個名字為“Create Jar”的DOS command。 

  將arguments更改為“"$[JavaHome]\bin\jar.exe" cvfM $[PrjName].jar

   META-INF\MANIFEST.MF *.CLASS *.png”。

  將 initial directory 更改為“$[PrjDir]。”

  3. 編寫實例代碼
  選擇“Empty Project”新建一個工程,並取名為myJ2 。JCreater會自動在你的工作目錄中生成子目錄“myJ2”。選擇“java File”新建一個Java文件。編寫以下代碼:

  import Javax.microedition.lcdui.*;

  import Javax.microedition.midlet.*;

  public class test extends MIDlet implements CommandListener {

  private KeyEventsDemoCanvas myCanvas;

  private Display myDisplay;

  private Command okCommand = new Command("OK", Command.OK, 1);

  myJ2() {

  myDisplay = Display.getDisplay(this);

  myCanvas = new KeyEventsDemoCanvas();

  myCanvas.addCommand(okCommand);

  myCanvas.setCommandListener(this);

  }

  public void commandAction(Command c, Displayable s) { }

  protected void startApp() throws MIDletStateChangeException {

  myDisplay.setCurrent(myCanvas);

  }

  protected void pauseApp() { }

  protected void destroyApp(boolean unconditional) { }

  class KeyEventsDemoCanvas extends Canvas {

  public final int BACKGROUND_COLOR = 0xFFFFFF;

  public final int FOREGROUND_COLOR = 0x000000;

  private int lastKey;

  public void paint(Graphics g) {

  g.setColor(BACKGROUND_COLOR);

  g.fillRect(0, 0, getWidth(), getHeight());

  g.setColor(FOREGROUND_COLOR);

  g.drawString("Press a key!", 0, 0, Graphics.TOP | Graphics.LEFT);

  if (lastKey != 0) {

  g.drawString("Key Code: " + lastKey, 0, g.getFont().getHeight(),

  Graphics.TOP | Graphics.LEFT);

  try {

  g.drawString("Action: " + getGameAction(lastKey), 0,

  2 * g.getFont().getHeight(),

  Graphics.TOP | Graphics.LEFT);

  g.drawString("Key Name: " + getKeyName(lastKey), 0,

  3 * g.getFont().getHeight(),

  Graphics.TOP | Graphics.LEFT);

  } catch (Exception e) {

  }

  }

  }

  public void keyPressed(int keyCode) {

  lastKey = keyCode;

  repaint(); 

  }

  public void keyRepeated(int keyCode) {

  System.out.println("Key repeated" + keyCode);

  }

  }

  保存文件,並命名為myJ2.Java。在Project中單擊“Add file”按鈕,在出現的對話框中選中你剛才的myJ2.Java文件,編譯程序,運行即可。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved