J2ME程式開發全方位基礎講解彙總
一、J2ME中需要的Java基礎知識
現在有大部分人,都是從零開始學J2ME的,學習J2ME的時候,總是從Java基礎開始學習,而且現在講Java基礎的書籍中都是以J2SE來講基礎,這就給學習造成了一些不必要的麻煩,下面將J2ME中用到的和不需要的Java基礎知識做一個簡單的說明。
J2ME中使用到的Java基礎知識:
1、Java語法基礎:包括基本資料型別、關鍵字、運算子等等
2、物件導向的思想:類和物件的概念,繼承和多型等等。
3、異常處理
4、多執行緒
J2ME中沒有用到的Java基礎知識:
1、JDK中javac和java命令的使用
2、Java基礎中的很多類在J2ME中沒有,或者類中的方法做了大量的精簡。所以建議在J2ME中熟悉類庫。
3、Applet、AWT、Swing這些知識在J2ME中根本使用不到。
簡單說這麼多,希望學J2ME的朋友們能少走一些彎路,不足之處希望大家積極指正和補充。
二、J2ME中暫時無法完成的功能
列一些J2ME中暫時無法完成的功能,希望大家能積極補充:
1、在手機中不更改程式碼實現移植,主要指遊戲。
2、動態修改按鈕文字。
3、在Canvas上接受中文輸入。
4、操作本地資源、例如地址本、已收簡訊息等。
5、製作破壞性的手機病毒。
6、其他等待大家來補充。
三、J2ME的跨平臺性
J2ME技術源於Java,所以也具有JVM的優勢,可以在支援Java的平臺上進行移植,但是現在的J2ME技術在跨平臺上卻做的很糟糕,我們來簡單看一下原因:
1、手機的螢幕尺寸不一:
這個主要在介面製作上。如果你使用的是高階使用者介面,比如你做的是應用開發或者使用者登陸、使用者註冊這樣的通用功能時,一般沒有什麼問題。
如果你使用的是低階使用者介面,比如你做的是遊戲,那麼你就需要考慮這個問題了。
2、廠商的擴充套件API不統一:
例如Nokia的擴充套件API類庫UI系列,在別的手機上或者沒有實現,或者包名不同等等。
3、手機平臺上實現的bug:
例如Nokia的7650在實現雙緩衝上有bug,那麼在這種機型上執行的軟體就不能使用雙緩衝。其他NOKIA上的一些bug,可以參看:http://blog.csdn.net/Mailbomb/archive/2005/03/24/329123.aspx
4、手機效能問題。
不同手機的可用記憶體、最大jar檔案都有要求,例如Nokia S40的大部分手機支援的最大jar檔案為64K,最大可用內容為210K。
所以現在的手機軟體,特別是遊戲都提供支援的機型列表,也才有了手機遊戲移植人員的存在。
四、學習J2ME可以從事的工作種類
現在J2ME技術可以說相當的火暴,這裡介紹一些學好了J2ME之後可以從事的工作的種類:
1、J2ME遊戲開發人員
根據遊戲策劃或者文件要求,在某種特定的機型(以Nokia S40或S60居多)開發遊戲程式。
這是現在大部分J2ME程式設計師從事的工作。
需要熟練掌握:高階使用者介面、低階使用者介面、執行緒,如果是網路遊戲,還需要熟練網路程式設計。
2、J2ME應用開發人員
現在的移動應用還不是很多,但是還是出現了一些,特別是移動定位以及移動商務相關的內容。
需要熟練掌握:高階使用者介面、執行緒和網路程式設計。
3、J2ME遊戲移植人員
參照原始碼,將可以在一個平臺上可以執行的遊戲移植到其他平臺上去。例如將Nokia S40的遊戲移植到S60上,或者索愛的T618等等。
主要是控制螢幕座標,有些可能需要替換一些API。
需要熟悉各平臺之間的差異以及相關的技術引數,比如螢幕大小、最大jar檔案尺寸等等。
五、J2ME程式設計的幾個原則
1、使用物件導向程式設計。
雖然使用程式導向程式設計可以減小檔案的尺寸,但是為了以後維護的方便和利於擴充套件,還是要使用物件導向程式設計。
2、使用MVC模式
將模型、介面和控制分離。現在很多的程式將三者合一,但是如果你做的程式比較大的話,還是建議你進行分離。
3、自動儲存使用者設定
使用RMS來儲存使用者的資訊,例如儲存使用者上次輸入的使用者名稱、密碼、使用者對於系統的設定等,這樣不僅可以減少使用者的輸入,而且對使用者友好。很多程式甚至做了自動登陸等。
4、一些系統設定允許使用者關閉。如背景音樂、背景燈顯示等。
5、將低階使用者介面的繪製動作放在一個獨立的執行緒裡面去。
6、在需要大量時間才能完成的工作時,給使用者一個等待介面。
六、從模擬器到真機測試
對於J2ME開發者來說,模擬器給我們帶來了很多方便,比如可以在模擬器中除錯程式以及很方便的察看程式的效果,但是模擬器也給我們帶來了一些問題,比如模擬器實現的bug等等,所以進行真機測試是必須的。
1、為什麼要進行真機測試?
因為模擬器程式可能存在bug,以及真機的效能有限,所以必須進行真機測試。
2、如何將程式傳輸到機器中?
將程式傳輸到機器中有如下方式:
a) OTA下載
b) 使用資料線傳輸
c) 紅外傳輸
d) 藍芽
你可以根據條件,選擇合適的方式。
3、 真機測試主要測什麼?
真機測試的內容很多,主要測試以下幾個方面:
a) 程式的功能
b) 程式的操作性,是否易操作
c) 程式的大小,比如Nokia S40系列的手機大部分接受的最大檔案尺寸為64K
d) 程式執行速度,速度是否可以忍受。
七、從WTK到廠商SDK
對於J2ME愛好者來說,基本上大家都是從SUN的WTK(J2ME Wireless Toolkit)開始的,但是對於實際應用來說,僅僅使用WTK是遠遠不夠的,所以在學習過程中,必須完成從WTK到SDK的跨越。
1、廠商SDK的下載地址?
http://blog.csdn.net/Mailbomb/archive/2005/01/01/236606.aspx
2、廠商SDK和WTK有什麼不同?
廠商SDK最簡單的理解就是在WTK的基礎上增加了自己的模擬器和自己的擴充套件API。
也就是說,你在使用廠商的SDK時,可以使用廠商的擴充套件類庫,例如Nokia的UI類庫,和廠商自己的模擬器而已。
每個廠商的擴充套件API都不多,而且不盡相同。
3、如何使用?
有些廠商SDK的使用都和WTK相同,例如SamSung。
Nokia提供了獨立的介面來開發,但是這個介面在實際開發中使用不多。
4、廠商SDK的問題
廠商SDK實現過程中,有一些bug,而且和真機實現不一致。例如NOKIA的混音播放問題等等。
八、在J2ME中獲得手機IMEI的方法
IMEI是Internation mobile entity identification的簡稱,在手機中輸入*#06#可以顯示該數字,長度為15位,全球唯一,永遠不會衝突,所以可以作為識別使用者的一個標誌。
下面是在J2ME中獲得IMEI的方法:
1、MOTO系列的手機可以通過讀取系統的IMEI屬性獲得,程式碼如下:
String imei = System.getProperty("IMEI");
2、SIEMENS系列的手機可以通過讀取系統的com.siemens.IMEI屬性獲得,程式碼如下:
String imei = System.getProperty("com.siemens.IMEI");
九、J2ME網路連線中顯示問題的解決辦法
在網路程式設計中,有些時候會出現一些在沒有接收到網路資料就顯示介面的,造成介面顯示不符合要求(例如公告顯示,會先顯示公告的背景圖片再顯示公告資訊),這裡提一個簡單的解決辦法給大家:
解決這種情況的方法分成三個步驟:
1、在需要顯示的介面中,呼叫傳送網路資料的方法。每次顯示時呼叫該構造方法,不呼叫Display的setCurrent方法顯示。
2、顯示等待介面(例如進度條等),給使用者提示,在進行網路連線。
3、在處理網路反饋的資料完以後,呼叫Display的setCurrent方法顯示顯示當前介面。
十、增強J2ME的String能力——分割字串
從JDK1.4以後,String類中新增了split方法來實現字串的分割,但是在J2ME中卻沒有該方法(MIDP2.0中也沒有實現),但是在實際使用過程中,有些時候的確要用到這種操作,這裡將我以前實現的一段程式碼和大家共享:
/**
* 分割字串,原理:檢測字串中的分割字串,然後取子串
* @param original 需要分割的字串
* @paran regex 分割字串
* @return 分割後生成的字串陣列
*/
private static String[] split(String original,String regex)
{
//取子串的起始位置
int startIndex = 0;
//將結果資料先放入Vector中
Vector v = new Vector();
//返回的結果字串陣列
String[] str = null;
//儲存取子串時起始位置
int index = 0;
//獲得匹配子串的位置
startIndex = original.indexOf(regex);
//System.out.println("0" + startIndex);
//如果起始字串的位置小於字串的長度,則證明沒有取到字串末尾。
//-1代表取到了末尾
while(startIndex < original.length() && startIndex != -1)
{
String temp = original.substring(index,startIndex);
System.out.println(" " + startIndex);
//取子串
v.addElement(temp);
//設定取子串的起始位置
index = startIndex + regex.length();
//獲得匹配子串的位置
startIndex = original.indexOf(regex,startIndex + regex.length());
}
//取結束的子串
v.addElement(original.substring(index + 1 - regex.length()));
//將Vector物件轉換成陣列
str = new String[v.size()];
for(int i=0;i
{
str[i] = (String)v.elementAt(i);
}
//返回生成的陣列
return str;
}
十一、J2ME在低階使用者介面上分行顯示文字
在J2ME的低階使用者介面開發中,經常會遇到需要在Canvas上顯示大量的文字,例如關於介面、遊戲說明、遊戲公告等資訊。如果在設計時,將文字的內容和長度都固定,既不利於修改也不利於維護。下面介紹一個簡單的方法,實現一個簡單、可維護性強的方式。
實現方法:
1、將需要顯示的所有資訊做成一個字串。
2、編寫一個將該字串按照要求轉換為字串陣列的方法。
3、將轉換後的陣列以迴圈的方式顯示在Canvas上。
通過這樣三個步驟,則修改顯示的資訊時,只需要修改包含顯示資訊的字串即可,自己書寫的方法可以按照以前的標準重新分割新的字串。如果需要修改每行顯示的字元個數,則只需要修改自己書寫的方法即可。
通過這樣一種實現方式,可以很方便的實現顯示一些比較長的文字資訊,即使是可變長度的字串也沒有問題。
十二、J2ME中使用記錄儲存系統(RMS)儲存資訊
在MIDP中,沒有檔案的概念,所以永久儲存一般只能依靠記錄儲存系統實現,關於記錄儲存系統的簡介,可以參看教程:http://www-900.ibm.com/developerWorks/cn/java/j-wi-rms/index.shtml
下面是一些記錄儲存系統的常用編碼介紹:
1、開啟記錄集:
開啟記錄集使用RecordStore裡面的靜態方法openRecordStore,示例程式碼如下:
RecordStore rs = RecordStore.openRecordStore(“username”,true);
這樣就開啟了一個名稱為rs的記錄集,其中username為記錄集的名稱,該名稱可以根據需要來取,第二個引數代表是否則沒有時建立新的記錄集,true代表在該記錄集不存在時,建立新的記錄集,false代表不建立。
如果在開啟記錄集時,該記錄集不存在,則丟擲RecordStoreNotFoundException異常,所以檢測記錄集是否已建立可以使用該異常。
注意:記錄集開啟以後記得關閉。
2、向記錄集中寫入資料
2.1增加資料
向已經開啟的記錄集中新增資料,需要使用addRecord方法,示例程式碼:
byte[] bytes = {1,2,3};
int id = rs. addRecord(bytes,0,bytes.length);
該程式碼將位元組陣列bytes的全部內容寫入到記錄集中,該方法的返回值為該資訊的id,注意:id從1開始,而不是從0開始。
你可以迴圈使用該方法向記錄集中寫入多條資料。
2.2修改資料
修改已經存在的記錄集中指定id的資料,需要使用setRecord方法,示例程式碼:
byte[] bytes = {1,2,3};
rs. setRecord(1,bytes,0,bytes.length);
以上程式碼的作用是將位元組陣列bytes的全部內容寫入到id為1的記錄集rs中。
該操作會覆蓋已有的資料。
說明:有些時候,你需要將資訊寫入到記錄集中的第一條記錄中,則可以結合以上兩個方法,則第一次時向記錄集增加資料,以後來進行修改。
3、從記錄集中讀出資料
從記錄集中讀取已有資料,需要使用getRecord方法,示例程式碼:
byte[] bytes = rs. getRecord(1);
該程式碼從記錄集rs中讀取第一條資料,將讀取到的資料放在bytes陣列中。
在讀取資料時,可以獲得記錄集中id的個數,可以使用getNumRecords方法獲得
綜合程式碼為:
int number = rs. getNumRecords();
int id = 1;
if(id >0 && id < number)
{
byte[] bytes = rs. getRecord(1);
}
4、從記錄集中刪除記錄
從記錄集中刪除記錄的方法有兩種:邏輯刪除和物理刪除。
邏輯刪除是指給刪除的記錄打標記。
物理刪除是指從物理上刪除該記錄,但是該記錄的id不能被重用,也就是說該id不會被繼續使用。例如一個記錄集中有5個記錄,假設你刪除了id為3的資料,則剩餘記錄的id依然為1、2、4、5。這給便歷帶來了一定的麻煩。
5、便歷記錄集
便歷記錄集,即訪問記錄集中的所有資料,有兩個方法,詳見:
http://gceclub.sun.com.cn/NASApp/sme/controller/teclist?tid=0103
6、其他操作
刪除記錄集
刪除記錄集不同於刪除記錄,需要使用deleteRecordStore方法,示例程式碼:
RecordStore. deleteRecordStore(“username”);
該程式碼刪除名稱為username的記錄集。
十三、J2ME加密資料的一個第三方開源免費類庫介紹
在J2ME程式設計中,經常遇到一些資料在儲存或者傳輸時需要加密,下面介紹一個第三方的加密類庫的一些資料:
加密類庫的官方主頁:http://www.bouncycastle.org/
介紹的文章:
中文:http://18900.motorola.com/ewa_portal/develope/jc_j2messl_5_1.jsp
英文:http://www.javaworld.com/javaworld/jw-12-2002/jw-1220-wireless.html
該文章的原始碼包含使用的一些方法。
備註:因為該類庫提供的功能比較強大,所以類庫的尺寸比較大,最後在釋出時需要將類庫中不需要的類刪除
十四、如何播放聲音
在J2ME中,處理聲音需要使用到Mobile Media API(MMAPI),該包是MIDP1.0的可選包,在MIDP2.0中已經包含了這個包。所以如果你使用MIDP1.0的話,請確認你的執行環境是否支援。
一般手機支援的聲音檔案格式為wav、mid和mpg等。具體請查閱你的手機說明文件。
在聲音處理中,有很多處理的方式,這裡說一下最常用的情況,播放JAR檔案中的wav檔案。
播放聲音檔案的流程:
1、按照一定的格式讀取聲音檔案。
播放JAR檔案中的聲音檔案一般是將聲音檔案處理成流的形式。示例程式碼:
InputStream is = this.getClass().getResourceAsStream("/Autorun.wav");
其中Autorun.wav檔案位於JAR檔案的根目錄下,如果位於別的目錄,需要加上目錄名稱,如/res /Autorun.wav。
2、將讀取到的內容傳遞給播放器。
將流資訊傳遞給播放器,播放器按照一定的格式來進行解碼操作,示例程式碼:
Player player = Manager.createPlayer(is,"audio/x-wav");
其中第一個引數為流物件,第二個引數為聲音檔案的格式。
3、播放聲音。
使用Player物件的start方法,可以將聲音播放出來,示例程式碼:
player.start();
在播放聲音時也可以設定聲音播放的次數,可以使用Player類中的setLoopCount方法來實現,具體可查閱API文件。
下面是在NOKIA S60模擬器中測試通過。程式碼如下:
package sound;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.media.*;
import java.io.*;
public class SoundMIDlet extends MIDlet
{
private Player player = null;
/** Constructor */
public SoundMIDlet()
{
try
{
InputStream is = this.getClass().getResourceAsStream("/Autorun.wav");
player = Manager.createPlayer(is,"audio/x-wav");
}
catch(IOException e)
{
System.out.println("1:" + e);
}
catch(MediaException e)
{
System.out.println("2:" + e);
}
catch(Exception e)
{
System.out.println("3:" + e);
}
}
/** Main method */
public void startApp()
{
if(player != null)
{
try
{
player.start();
}
catch(MediaException e)
{
System.out.println("4:" + e);
}
}
}
/** Handle pausing the MIDlet */
public void pauseApp()
{
}
/** Handle destroying the MIDlet */
public void destroyApp(boolean unconditional)
{
}
}
十五、J2ME 3D程式設計的一些資料
隨著J2ME技術的發展,以及硬體速度的提升,3D遊戲程式將慢慢的變成主流,最近想學習這一塊的程式設計,所以收集了一些資料,和大家一起分享:
1、JSR184
JSR184是Nokia公司起草的一個關於3D API的規範,下載地址為:
http://www.forum.nokia.com/main/1,,1_0_10,00.html#jsr184
2、Nokia的3D程式設計資料
http://www.forum.nokia.com/main/1,6566,21,00.html
3、3D引擎
一個簡單的開放原始碼的3D遊戲引擎
http://www.j2me.com.cn/Soft_Show.asp?SoftID=19
國內一個合作開發3D引擎的專案:
http://gceclub.sun.com.cn/NASApp/sme/jive/thread.jsp?forum=11&thread=8593
4、一款3D遊戲產品
http://games.sina.com.cn/newgames/2004/04/040217696.shtml
5、支援3D的開發工具
當前一些高階的手機支援3D開發,支援3D開發的開發工具中,通用的有SUN的J2MEWTK2.2。專用的是廠商提高的支援JSR184的SDK。
十六、3D程式設計——第一個3D程式
參考WTK2.2提供的demo,完成了第一個3D程式,雖然很簡單,而且有些問題還不是很清楚,還是把程式碼共享出來和願意學習J2ME 3D程式設計的朋友一起學習。
關於程式碼的編譯和執行說明如下:
1、以下程式碼在J2ME WTK2.2下面編譯通過。
2、程式碼分為兩個檔案:First3DCanvas.java和First3DMIDlet.java。
3、使用J2ME WTK2.2建立新的工程,主MIDlet類為:first3d. First3DMIDlet
4、將程式碼儲存在你的工程目錄下的first3d目錄下。
5、將J2ME WTK安裝目錄下的apps\Demo3D\res\com\superscape\m3g\wtksamples\retainedmode\content目錄中的swerve.m3g檔案複製到你的工程目錄下的res目錄下。
6、你的工程建立後,設定工程,通過WTK介面中的“設定”按鈕開啟設定視窗,在“API選擇”中,設定“目標平臺”為:自定義;“簡檔”為
“MIDP2.0”;“配置”為“CLDC1.1”;選中“Mobile 3D Graphics for J2ME(JSR184)”。
7、這樣你就可以編譯和執行以下程式碼了。
原始碼如下:
// First3DMIDlet.java
package first3d;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class First3DMIDlet extends MIDlet
{
private First3DCanvas displayable = new First3DCanvas();
public void startApp()
{
Display.getDisplay(this).setCurrent(displayable);
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
}
// First3Dcanvas.java
package first3d;
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
import java.util.*;
/**
* 第一個3D程式
*/
public class First3DCanvas extends Canvas implements Runnable
{
/**World物件*/
private World myWorld = null;
/**Graphics3D物件*/
private Graphics3D g3d = Graphics3D.getInstance();
/**Camera物件*/
private Camera cam = null;
private int viewport_x;
private int viewport_y;
private int viewport_width;
private int viewport_height;
private long worldStartTime = 0;
//重繪時間
private int validity = 0;
public First3DCanvas()
{
//啟動重繪介面的執行緒
Thread thread = new Thread(this);
thread.start();
try
{
//匯入3D圖片
myWorld = (World) Loader.load("/swerve.m3g")[0];
viewport_x = 0;
viewport_y = 0;
viewport_width = getWidth();
viewport_height = getHeight();
cam = myWorld.getActiveCamera();
//設定cam物件
float[] params = new float[4];
int type = cam.getProjection(params);
if (type != Camera.GENERIC)
{
//calculate window aspect ratio
float waspect = viewport_width / viewport_height;
if (waspect < params[1])
{
float height = viewport_width / params[1];
viewport_height = (int) height;
viewport_y = (getHeight() - viewport_height) / 2;
}
else
{
float width = viewport_height * params[1];
viewport_width = (int) width;
viewport_x = (getWidth() - viewport_width) / 2;
}
}
worldStartTime = System.currentTimeMillis();
}
catch (Exception e) {}
}
protected void paint(Graphics g)
{
//清除背景
g.setColor(0x00);
g.fillRect(0, 0, getWidth(), getHeight());
//和3D物件繫結
g3d.bindTarget(g);
g3d.setViewport(viewport_x, viewport_y, viewport_width, viewport_height);
long startTime = System.currentTimeMillis() - worldStartTime;
validity = myWorld.animate((int)startTime);
try
{
g3d.render(myWorld);
}
finally
{
g3d.releaseTarget();
}
}
public void run()
{
try
{
while(true)
{
//重繪圖形
repaint(viewport_x, viewport_y, viewport_width, viewport_height);
}
}
catch(Exception e){}
}
}
十七、在J2ME網路程式設計中使用CMWAP代理
在中國移動提供的網路連線中,分為CMNET和CMWAP兩種,其中CMNET可以無限制的訪問網際網路絡,資費比較貴。CMWAP類似一個HTTP的程式碼,只能訪問支援HTTP的應用,但是資費便宜,穩定性比較差。
在實際的J2ME網路程式設計中,一般需要提供以CMWAP代理的方式連線網路,在J2ME中,連線的程式碼和直接連線有所不同,程式碼如下:
HttpConnection http = (HttpConnection)Connector.open(("http://10.0.0.172/"+url);
http.setRequestProperty("X-Online-Host",ServerName);
例如你需要訪問的地址為:http://www.test.com/login/loginServlet則上面的程式碼就為:
HttpConnection http = (HttpConnection)Connector.open(("http://10.0.0.172/" + "login/loginServlet");
http.setRequestProperty("X-Online-Host","www.test.com");
在實際使用過程中,只需要使用實際需要訪問的地址的域名或者IP來代替ServerName,例如示例中的“www.test.com”,使用後續的地
址類代替程式碼中的url,例如示例中的“login/loginServlet”,就可以實際的使用CMWAP代理來進行連線了。
十八、J2ME中的時間處理全攻略
時間處理在程式開發中相當常見,下面對於時間處理做一個簡單的說明。
一、時間的表達方式
時間在J2ME中有兩種表達方式:
1、以和GMT1970年1月1號午夜12點和現在相差的毫秒數來代表
這種方式適合比較兩個時間之間的差值。
2、以物件的形式來表達
二、時間處理的相關類
時間處理在J2ME中涉及三個類:
1、System類
long time = System. currentTimeMillis();
使用該方法可以獲得當前時間,時間的表達方式為上面提到的第一種。
2、Date類
Date date = new Date();
獲得當前時間,使用物件的形式來進行表達。
3、Calendar類
Calendar calendar = Calendar. getInstance();
三、時間處理的具體操作
1、以上三種表達方式的轉換:
a)將System類獲得的時間轉換為Date物件
Date date = new Date(System. currentTimeMillis());
b)將Date型別的物件轉換為Calendar型別的物件
Calendar calendar = Calendar. getInstance();
Date date = new Date();
calendar.setTime(date);
2、使用Calendar完成一些日期操作:
Calendar是時間處理中最常用也是功能最強大的類,可以用它來獲得某個時間的日期、星期幾等資訊。
獲得日期:
Calendar calendar = Calendar. getInstance();
……
int day = calendar.get(Calendar. DATE);
獲得日期、年份、星期的操作和這個類似。
需要注意的是:Calendar中表示月份的數字和實際相差1,即1月用數字0表示,2月用數字1表示,……12月用數字11表示。
十九、J2ME中隨機數字處理全攻略
在程式中生成隨機數字,用處比較,如人工智慧領域等等,這裡對於在J2ME中生成隨機數的操作進行一個簡單的整理,希望對大家能有幫助。
J2ME和J2SE不同,不能使用Math類的random來生成隨機數字,只能使用java.util包的Random類來生成隨機數字。
1、建立Random型別的物件:
Random random = new Random();
Random random = new Random(10010010);
以上兩種是建立Random物件的方式,第一種使用預設構造方法,和以下的程式碼作用完全等價:
Random random = new Random(System. currentTimeMillis());
相當與使用當前時間作為種子數字來進行建立。
第二種方式通過自己來指定種子數字來進行建立。
大家可以根據需要使用以上兩種方式的任一種。
2、生成隨機數字:
建立好了隨機物件以後,我們就可以來生成隨機數字了:
生成隨機整數:
int k = random.nextInt();
生成隨機長整數:
long l = random.nextLong();
3、生成指定範圍的數字:
例如生成0-10之間的隨機數字:
int k = random.nextInt();
int j = Math.abs(k % 10);
首先生成一個隨機整數k,然後用k和10取餘,最後使用Math類的abs方法取絕對值,獲得0-10之間的隨機數字。
獲得0-15之間的隨機數,類似:
int k = random.nextInt();
int j = Math.abs(k % 15);
獲得10-20之間的隨機數字:
int k = random.nextInt();
int j = Math.abs(k % 10) + 10;
二十、在J2ME手機程式設計中使用字型
在J2ME手機程式設計中,可以通過使用字型類——Font在低階使用者介面中,獲得更好的表現效果,那麼如何使用Font類呢?
首先,由於手機裝置的限制,手機中支援的字型型別很有限,所以在J2ME中只能使用手機支援的預設字型來構造Font類物件。下面是建立Font類的物件時使用的方法:
getFont(int face,int style,int size);
例如:
Font font = Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font. SIZE_MEDIUM);
無論哪一個引數,都只能使用系統設定的數值,這些數值具體的大小在不同的手機上可能不同。下面對於其中的三個引數的取值做詳細的介紹:
face引數指字型的外觀,其的取值:
FACE_MONOSPACE——等寬字型
FACE_PROPORTIONAL——均衡字型
FACE_SYSTEM——系統字型
style引數指字型的樣式,其的取值:
STYLE_BOLD——粗體
STYLE_ITALIC——斜體
STYLE_PLAIN——普通
STYLE_UNDERLINED——下劃線
STYLE_BOLD | STYLE_ITALIC——粗斜體
STYLE_UNDERLINED | STYLE_BOLD——帶下劃線粗體
STYLE_UNDERLINED | STYLE_ITALIC——帶下劃線斜體
STYLE_UNDERLINED | STYLE_ITALIC | STYLE_BOLD——帶下劃線的粗斜體
size引數指字型的大小,其的取值:
SIZE_SMALL——小
SIZE_MEDIUM——中
SIZE_LARGE——大
通過上面的引數的值,可以組合出你需要的字型物件。
下面是一些常用的字型操作:
1. 獲得系統的預設字型:
Font font = Font.getDefaultFont();
2. 在panit方法內部,假設Graphics引數的名稱為g,則獲得當前字型的方法是:
Font font = g.getFont();
3. 在panit方法內部,假設Graphics引數的名稱為g,則設定當前字型的方法是:
g.setFont(font);
其中font為你構造好的字型物件。
4. 在MIDP2.0中,List可以設定每行的字型格式,方法是:
list.setFont(0,font);
則上面的程式碼是將list中的第一行設定為font型別的字型。
二十一、在J2ME手機程式開發中使用顏色
在J2ME手機開發過程中,需要經常用到顏色來進行繪製,增強程式的表現效果,下面就介紹一下如何使用顏色。
由於J2ME技術比較簡單,所以沒有實現專門的顏色類,而只是使用RGB的概念來代表顏色。這裡簡單介紹一下RGB的概念,顏色是由紅(Red)、綠
(Green)、藍(Blue)三原色組成的,所以可以使用這三個顏色的組合來代表一種具體的顏色,其中R、G、B的每個數值都位於0-255之間。在表
達顏色的時候,即可以使用三個數字來表達,也可以使用一個格式如0X00RRGGBB這樣格式的十六進位制來表達,下面是常見顏色的表達形式:
紅色:(255,0,0)或0x00FF0000
綠色:(0,255,0)或0x0000FF00
藍色:(255,255,255)或0x00FFFFFF
其他顏色也可以通過上面的方式組合出來。
知道了顏色的表達方式以後,下面來介紹一下如何在J2ME程式中使用顏色,涉及的方法均在Graphics類中,有以下幾個:
1.getColor():
獲得當前使用的顏色,返回值是0x00RRGGBB格式的數字。例如:
int color = g.getColor();
其中g為Graphics型別的物件。
2.setColor(int RGB):
設定使用的顏色。例如:
g.setColor(0x00ff0000);
3.setColor(int red, int green, int blue)
和上面的方法作用一樣,例如:
g.setColor(255,0,0);
在設定了Graphics使用的顏色以後,再進行繪製的時候,就可以繪製指定的顏色了。
二十二、在J2ME聯網應用中獲得客戶端的手機號碼
在J2ME程式開發過程中,為了一定的需要,經常需要來獲得使用者的手機號碼,但是這個功能卻在標準的J2ME類庫中沒有提供。
在使用中國移動的CMWAP方式連線網路時,中國移動會將使用者的手機號碼放在一個名稱為x-up-calling-line-id的頭資訊中,可以通過讀取該頭資訊,獲得使用者的手機號碼,具體程式碼如下:
String usermphone = http.getHeader("x-up-calling-line-id");
其中http是HttpConnction型別的物件。
二十三、使用J2ME傳送手機簡訊息
在程式中,傳送簡訊息的方式一般有三種:
1、 使用程式在網路上傳送簡訊息,例如各大網站的簡訊業務。這種方式是通過程式將資訊傳送給運營商的閘道器伺服器,然後通過運營商的網路傳送給手機。
2、 在計算機中,通過資料線連線到手機,然後通過手機來傳送簡訊息。這種方式是通過使用AT指令來實現。愛立信手機的AT指令你可以在以下地址找到:
http://mobilityworld.ericsson.com.cn/development/download_hit.asp
3、 通過在手機中執行的程式來傳送簡訊息。這個正是本文實現的方式。
在J2ME中,如果想傳送簡訊息,需要使用WMA包,MIDP2.0中已經包含,MIDP1.0中可以通過廠商提供的擴充套件API實現,和WMA的類庫基本一樣。
下面是使用WMA向指定手機號碼傳送簡訊息的一個方法,很簡單。當然WMA也提供了其他的方式來傳送更多的內容。
// SMSUtil.java
package my.util;
import javax.wireless.messaging.*;
import javax.microedition.io.*;
/**
* 傳送文字簡訊息的方法
*/
public class SMSUtil
{
/**
* 給指定號碼傳送簡訊息
* @param content 簡訊息內容
* @param phoneNumber 手機號碼
* @return 傳送成功返回true,否則返回false
*/
public static boolean send(String content,String phoneNumber)
{
//返回值
boolean result = true;
try
{
//地址
String address = "sms://+" + phoneNumber;
//建立連線
MessageConnection conn = (MessageConnection)Connector.open(address);
//設定簡訊息型別為文字,簡訊息有文字和二進位制兩種型別
TextMessage msg = (TextMessage)conn.newMessage(MessageConnection.TEXT_MESSAGE);
//設定資訊內容
msg.setPayloadText(content);
//傳送
conn.send(msg);
}
catch(Exception e)
{
result = false;
//未處理
}
return result;
}
}
二十四、使用簡單的J2ME程式測試MIDlet的生命週期
在MIDlet程式學習中,生命週期是一個比較抽象的概念。其實生命週期就是一個簡單的規定,規定了MIDlet中的每個方法,什麼時候被系統呼叫。下
面是一個示例程式碼,在每個方法的內部都輸出一條語句,可以根據程式的輸出結果來驗證各方法被呼叫的順序,具體程式碼如下:
//檔名:LifeCircleMIDlet.java
import javax.microedition.midlet.*;
/**
* 測試MIDlet的生命週期
*/
public class LifeCircleMIDlet extends MIDlet
{
/**
* 預設構造方法
*/
public LifeCircleMIDlet()
{
System.out.println("預設構造方法");
}
/**
* 啟動方法
*/
public void startApp()
{
System.out.println("startApp方法");
}
/**
* 暫停方法
*/
public void pauseApp()
{
System.out.println("pauseApp方法");
}
/**
* 銷燬方法
* @param b
*/
public void destroyApp(boolean b)
{
System.out.println("destroyApp方法");
}
}
在J2WTK中執行該程式時,可以使用瀏覽器中的“MIDlet”選單中的暫停和恢復選單,模擬暫停事件。
二十五、使用OTA來發布你的程式
眾所周知,J2ME程式釋出的形式主要有:OTA、資料線傳輸、紅外和藍芽傳輸等。這裡簡單說說如何通過OTA來發布你的程式。
OTA是Over The Air的簡寫,也就是通過網路下載,這是主要的釋出形式之一。現在的百寶箱都是採用這種形式。
使用OTA來發布程式,需要如下幾個步驟:
1、在你的WEB伺服器上新增對於jad和jar檔案的MIME支援。
字尾名:jad
MIME型別:text/vnd.sun.j2me.app-descriptor
字尾名:jar
MIME型別:application/java-archive
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21255398/viewspace-600383/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- J2ME遊戲開發例項講解遊戲開發
- Spring基礎知識彙總 Java開發必看SpringJava
- j2me遊戲開發例項講解 (轉)遊戲開發
- J2ME遊戲開發例項講解(上)(轉)遊戲開發
- J2ME遊戲開發例項講解(下)(轉)遊戲開發
- iOS 基礎面試題彙總iOS面試題
- HTML基礎講解HTML
- javaScript基礎講解JavaScript
- JS基礎知識梳理彙總 如何能學好Web前端開發JSWeb前端
- 微信小程式開發問題彙總微信小程式
- 前端基礎進階(五):全方位解讀this前端
- 影片解碼基礎講解
- 基於J2ME的遊戲開發總結和感想薦遊戲開發
- mysql 索引的基礎操作彙總MySql索引
- MySQL基礎知識點彙總MySql
- linux 基礎知識彙總Linux
- Java開發基礎常見面試題及答案彙總(實用乾貨!)Java面試題
- 開發框架彙總框架
- Redis 基礎特性講解Redis
- 安卓動畫基礎講解安卓動畫
- Android網路程式設計:基礎理論彙總Android程式設計
- 微信小程式開發完工+問題彙總微信小程式
- 詳細講解DirectDraw程式設計基礎(轉)程式設計
- 音訊解碼基礎講解音訊
- Python基礎(九) 常用模組彙總Python
- Python面試基礎題小彙總Python面試
- BSN-DDC基礎網路詳解(十一):官方門戶OpenAPI說明及開發資料彙總API
- 小程式開發基礎(一)
- Mac開發工具彙總Mac
- JavaScriptMobile開發框架彙總JavaScript框架
- RESTful 架構 基礎講解REST架構
- 字首和的基礎講解
- 數學基礎講解-02
- 數學基礎講解-04
- 數學基礎講解-05
- 數學基礎講解-6
- spark 基礎開發 Tips總結Spark
- ArcGIS Engine開發基礎總結(一)