MIDP 2.0提供了一系列的新特性,其中一個就是調用平台的應用。例如可以調用WAP浏覽器訪問特定的網址,也可以調用電話應用程序呼叫某個號碼。上述兩個功能都可以使用MIDlet類的platformRequest()方法實現,platformRequest()接受一個String類型的參數url,如果是呼叫電話號碼則url的形式為tel:13810011001。如果是調用WAP浏覽器則url的形式類似於wap.wml">http://www.J2MEdev.com/wap.wml。
本文介紹如何使用platformRequest()方法自動更新MIDlet套件,在MIDP的文檔中說明。如果url的形式為一個指定的MIDlet套件,可以是JAD文件,也可以是jar文件。例如http://www.J2MEdev.com/helloworld.jad。這個時候,此請求會被認為是安裝MIDlet套件來對待,這樣用戶可以控制安裝的過程,就像我們直接從WAP浏覽器輸入地址安裝MIDlet套件一樣。如果請求的MIDlet套件是當前正在運行的應用程序的升級版,則當前的程序需要先退出,然後執行更新操作。
如果想讓發布的MIDlet套件具備自動升級的功能,那麼需要提供一個服務器端程序,服務器端程序能夠檢測是不是有更新版本的應用程序下載,並且可以將這個結果告訴給客戶端。通常這樣的服務器端可以實現為Web應用程序,用servlet和MIDlet通信。當用戶運行MIDlet的時候,MIDlet首先連接指定的服務器獲取信息,如果沒有新版軟件則正常運行,如果有新版本的軟件則是用platformRequest()方法請求安裝應用程序。
if (update == NEED_UPDATE) {
try {
platformRequest("http://www.J2MEdev.com/wap/autoupdate.jar");
destroyApp(true);
notifyDestroyed();
} catch (ConnectionNotFoundException ex) {
ex.printStackTrace();
}
}else{
//do something else
}
這裡我們在代碼中執行destroyApp(true),讓MIDlet套件主動退出。如果想做的更為專業,可以在檢測到有新版本的軟件的時候,顯示一個對話框讓用戶選擇是否自動更新,根據用戶的選擇執行相關的操作。下面的代碼UpdateMIDlet可以用於演示此項功能。
/**
* author mingJava
* Created on
*/
package com.J2MEdev.autoupdate;
import Java.util.Random;
import Javax.microedition.io.ConnectionNotFoundException;
import Javax.microedition.lcdui.Display;
import Javax.microedition.lcdui.Form;
import Javax.microedition.midlet.MIDlet;
import Javax.microedition.midlet.MIDletStateChangeException;
public class UpdateMIDlet extends MIDlet {
public static int NEED_UPDATE = 0;
public static int NO_UPDATE = 1;
private Display display = null;
protected void startApp() throws MIDletStateChangeException {
if (display == null) {
display = Display.getDisplay(this);
int update = (new Random().nextInt() >>> 1) % 2;
if (update == NEED_UPDATE) {
try {
platformRequest("http://www.J2MEdev.com/wap/autoupdate.jar");
destroyApp(true);
notifyDestroyed();
} catch (ConnectionNotFoundException ex) {
ex.printStackTrace();
}
}else if(update == NO_UPDATE){
Form form = new Form("Test");
form.append("No update is needed");
display.setCurrent(form);
}
}
}
protected void pauseApp() {
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
}
}
為了模擬是否有升級軟件的可能,我們在startApp()中隨機生成一個隨機數update。如果update等於0則代表有升級版本,如果update等於1則代表不需要升級。為了簡單起見,這裡我們沒有編寫聯網檢測升級版本的程序。此程序在Nokia 7610上測試通過,可以自動升級MIDlet套件。