標簽(空格分隔): Android JQueryMobile
一、 通過Javascript訪問Android的Java代碼
說明:
Android提供了一個方法,可以供Javascript去訪問Java應用恃鞋,這個方法是位于android.webkit.WebView類中的addJavascriptInterface(Object object, String interfaceName)方法。這個方法允許從Javascript代碼去訪問在WebView中運行的Java類中的public方法睬塌,addJavascriptInterface方法中的obj為與javascript通信的應用程序庐船,interfaceName為提供給JavaScript調用的名稱。
示例代碼:
public class ContactsActivity extends Activity{
WebView webView;
public void onCreate(Bundle savedInstanceState){
webView = new WebView(this);
webView.addJavascriptInterface(this, "contactSupport");
}
public void deleteContact(String contactId, String displayPage){
}
}
這段代碼榄棵,顯示了ContactsActivity這個類的實例凝颇,如何通過addJavascriptInterface方法,對外暴露為一個Javascript對象疹鳄,對外的接口名稱為“contactSupport”拧略。其中ContactsActivity中有很多public方法,它向外暴露了其中的deleteContact()方法瘪弓。
<script>
function someJavaScriptFunction() {
contactSupport.deleteContact(contactIdVar.val(), "ListPage.html");
}
</script>
這段Javascript代碼則顯示了如何訪問后端Java代碼ContactsActivity 對象實例中的deleteContact方法垫蛆。
二、Android Java代碼訪問前端Javascript代碼
說明:
使用WebView類中的loadUrl(String url)方法去實現兩個目的:
- 在Webview瀏覽器中加載HTML頁
- 在WebView中加載HTML時,可以一道加載其中的Javascript袱饭。
注意:
- 在同一個容器頁面中弛随,不同內容頁之間的跳轉,都使用Javascript代碼宁赤。
- 在不同的容器中的互相調用舀透,需要在WebView的Java應用程序中,通過使用WebView.loadUrl(String url)去加載决左。
步驟:
- 用戶首先訪問HTML網頁愕够,這時調用Javascipt顯示頁面
- 接著,Javascript進行一些數據的處理佛猛,并調用后端的Java代碼惑芭。
- 在Java代碼處理完后,會通過loadUrl的方法继找,回調前端的Javascript代碼或者加載HTML頁遂跟。
示例代碼:
public class ContactsActivity extends Activity {
WebView webView;
private Handler handler = null;
public void onCreate(Bundle savedInstanceState) {
webView = new WebView(this);
handler = new Handler();
webView.addJavascriptInterface(this, "contactSupport");
}
public void deleteContact(String contactId, String displayPage) {
//刪除數據庫中的記錄
ContactUtility.deleteContact(contactId);
//頁面跳轉
loadPage(displayPage);
}
public void loadPage(String in) {
final String url = "file:///android_asset/www/" + in;
loadURL(url);
}
private void loadURL(final String in) {
handler.post(new Runnable() {
public void run() {
webView.loadUrl(in);
}
});
}
}
這段代碼,展示了前端的Javascript代碼調用了后段的delteContact()方法后婴渡,刪除數據庫中的記錄幻锁,然后重新加載一個HTML頁進行顯示。
在Android中边臼,新啟動的線程是無法刷新或者訪問UI界面的哄尔,因此就要使用Handler機制。在這里柠并,deleteContact()方法是無法直接調用 WebView.loadUrl()的岭接,主要有兩個原因,一個是WebView實例是在onCreate方法中創(chuàng)建調用的臼予,這是在主線程中鸣戴;第二個原因是當Javascript去調用deleteContact()時,執(zhí)行它的線程實際上是跟ContactsActivity中的onCreate()方法中的主線程是不同的粘拾。
在deleteContac()中窄锅,我們刪除了某條通訊錄記錄。接下來半哟,我們調用loadPage方法酬滤,這里我們指定了將要跳轉的顯示頁面,并在前面加了file:///android_asset/www/的前綴寓涨,意思是我們跳轉的這個頁面盯串,實際上是存放在android_asset/www目錄下的。最后戒良,我們在loadURL方法中使用Handler機制的post体捏,在新開的線程中加在WebView的loadUrl方法,并將其發(fā)送到消息隊列中去。
三几缭、 調用前端的Javascript
示例代碼:
public void getAllContacts(String callback, String accountCallback){
final String accountCallbackFunction = "javascript:" + accountCallback + "()";
if(accountName == null){
loadURL(accountCallbackFunction);
return;
}
final String json = ContactUtility.getAllContactDisplaysJSON(getContentResolver());
final String callbackFunction = "javascript:" + callback + "(" + json + ")";
loadURL(callbackFunction);
}
在這段代碼中河泳,getAllContacts方法的作用是產生JSON格式的通訊錄列表,其結果存放在json文本中年栓。然后再把結果回調給前端的javascript方法去處理解析JSON文本拆挥。這里的callbackFunction = "javascript:" + callback + "(" + json + ")",通過javascript:前端處理的Javascript方法名+JSON格式結果集某抓,返回給前端纸兔。最后也是通過loadURL方法,則可以達到調用前端Javascipt處理的效果否副。
<script>
$(document).ready(function(){
contactSupport.getAllContacts("setContactsList", "showAccount");
});
</script>
在這代碼中汉矿,調用了Java后端的getAllContacts方法,而getAllContacts方法獲得JSON格式的結果集后备禀,會調用前端Javascript的setContactsList方法去處理洲拇,而參數中的showAccount,在后端的getAllContacts方法中曲尸,判斷如果當前通訊錄沒有任何數據時赋续,則會重新使用前端的showAccount這個Javascript方法去處理。
四队腐、前后端交互中參數的類型問題
說明:
在以上代碼中蚕捉,我們在前后端的交互中,只是使用了字符串類型柴淘。而其他類型如Integer等都將被轉型為字符串。而象復合類型的對象都將以JSON的形式進行傳遞交互秘通。在Java后端中为严,我們會使用Jackson JSON處理類庫對Java對象及JSON對象進行轉換,在Javascript前端中肺稀,則采用jQuery.parseJSON()方法去解析后端返回的JSON第股。
五、JOSN介紹
JSON(JavaScript Object Notation),是一種輕量級的數據交換格式话原。JSON與XML具有相同的特征夕吻,例如易于編寫和閱讀,易于機器生成和解析繁仁。但是JSON比XML數據傳輸的有效性要高出很多涉馅。JOSN完全獨立于編程語言,使用文本格式保存黄虱。
JSON數據有兩種結構:
l Name-Value對構成的集合稚矿,類似于Java中的Map。
l Value的有序列表,類似于Java中的Array晤揣。
JSON格式的數據示例:
{
"Name": "Apple"桥爽,
"Expiry": "2007/10/11 13:54",
"Price": 3.99,
"Sizes": ["Small", "Medium", "Large"]
}
更多關于JSON的說明請參看http://wwww.json.org/json-zh.html