Phonegap經過JS訪問本地接口的兩種方法

Phonegap爲跨設備的應用開發提供了一個解決方案。若是某個應用只有js和html,則能夠經過Phonegap的在線build工具,編譯出多個平臺的app安裝包。固然經過Phonegap提供的js能夠訪問部分設備的資源,如網絡鏈接(Connection)、相機(Camera)、文件(File)、存儲(Storage)等,具體能夠參看Phonegap開發文檔。但不少Android應用,僅僅使用這些資源是知足不了需求的,因此必然須要訪問本地接口的方法。html

 

初步實驗,至少有兩個方法能夠訪問本地的接口。java

  • 開發Phonegap Plugin。經過實現Phonegap提供的接口,而後在config.xml中註冊插件,就能夠經過js開訪問了。具體能夠參考Plugin Development GuideDeveloping a Plugin on Android
  • 直接寫Java類,經過DroidGap.appView.addJavascriptInterface暴露Java接口。按照這篇博客能夠寫出來。

對於第一種方法,雖然官方已經提供了教程,但我認爲仍是有必要梳理一下流程,由於官網的教程忽略了因爲升級須要的更改。android

  • 實現CordovaPlugin 提供接口
Java代碼   收藏代碼
  1. <span style="font-size: 14px;">package org.apache.cordova.plugin;  
  2.   
  3. import org.apache.cordova.api.CordovaPlugin;  
  4. import org.apache.cordova.api.PluginResult;  
  5. import org.json.JSONArray;  
  6. import org.json.JSONException;  
  7. import org.json.JSONObject;  
  8.   
  9. /** 
  10.  * This class echoes a string called from JavaScript. 
  11.  */  
  12. public class Echo extends CordovaPlugin {  
  13.     @Override  
  14.     public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {  
  15.         if (action.equals("echo")) {  
  16.             String message = args.getString(0);   
  17.             this.echo(message, callbackContext);  
  18.             return true;  
  19.         }  
  20.         return false;  
  21.     }  
  22.   
  23.     private void echo(String message, CallbackContext callbackContext) {  
  24.         if (message != null && message.length() > 0) {   
  25.             callbackContext.success(message);  
  26.         } else {  
  27.             callbackContext.error("Expected one non-empty string argument.");  
  28.         }  
  29.     }  
  30. }</span>  

 

  • 修改config.xml

添加如下代碼apache

 

Xml代碼   收藏代碼
  1. <span style="font-size: 14px;"><plugin name="Echo" value="org.apache.cordova.plugin.Echo" /></span>  
  • 爲windows(或者其餘對象)添加echo方法

官網爲cordova.exec(...),這裏須要根據2.6的js接口使用做如下修改。json

Js代碼   收藏代碼
  1. <span style="font-size: 14px;">window.echo = function(str, callback) {</span>  
  2. <span style="font-size: 14px;">    <strong>var exec = cordova.require('cordova/exec');</strong>  
  3.     <strong>exec</strong>(callback, function(err) {  
  4.         callback('Nothing to echo.');  
  5.     }, "Echo""echo", [str]);  
  6. };</span>  

 

  •  經過js調用接口

 

Js代碼   收藏代碼
  1. <span style="font-size: 14px;">window.echo("echome"function(echoValue) {  
  2.     alert(echoValue == "echome"); // should alert true.  
  3. });</span>  

 另外,對於回調函數調用的線程有三種狀況:
windows

 

 

  • 若是直接調用,即callbackContext.success(),則在WebCore 線程中執行,而是在UI線程。
  • 若是但願在UI線程中直接,須要將回調函數封裝在Runanble中,放在cordova.getActivity().runOnUiThread中執行。

 

Java代碼   收藏代碼
  1. <span style="font-size: 14px;">cordova.getActivity().runOnUiThread(new Runnable() {  
  2.             public void run() {  
  3.                 ...  
  4.                 callbackContext.success(); // Thread-safe.  
  5.             }  
  6.         });  
  7.  </span>  

 

 

  • 若是指望在單獨的線程中執行(不至於阻塞WebCore線程),則使用 cordova.getThreadPool().execute方法。
Java代碼   收藏代碼
    1. <span style="font-size: 14px;"> cordova.getThreadPool().execute(new Runnable() {  
    2.             public void run() {  
    3.                 ...  
    4.                 callbackContext.success(); // Thread-safe.  
    5.             }  
    6.         });</span> 
相關文章
相關標籤/搜索