Phonegap爲跨設備的應用開發提供了一個解決方案。若是某個應用只有js和html,則能夠經過Phonegap的在線build工具,編譯出多個平臺的app安裝包。固然經過Phonegap提供的js能夠訪問部分設備的資源,如網絡鏈接(Connection)、相機(Camera)、文件(File)、存儲(Storage)等,具體能夠參看Phonegap開發文檔。但不少Android應用,僅僅使用這些資源是知足不了需求的,因此必然須要訪問本地接口的方法。html
初步實驗,至少有兩個方法能夠訪問本地的接口。java
對於第一種方法,雖然官方已經提供了教程,但我認爲仍是有必要梳理一下流程,由於官網的教程忽略了因爲升級須要的更改。android
- <span style="font-size: 14px;">package org.apache.cordova.plugin;
-
- import org.apache.cordova.api.CordovaPlugin;
- import org.apache.cordova.api.PluginResult;
- import org.json.JSONArray;
- import org.json.JSONException;
- import org.json.JSONObject;
-
-
-
-
- public class Echo extends CordovaPlugin {
- @Override
- public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
- if (action.equals("echo")) {
- String message = args.getString(0);
- this.echo(message, callbackContext);
- return true;
- }
- return false;
- }
-
- private void echo(String message, CallbackContext callbackContext) {
- if (message != null && message.length() > 0) {
- callbackContext.success(message);
- } else {
- callbackContext.error("Expected one non-empty string argument.");
- }
- }
- }</span>
添加如下代碼apache
- <span style="font-size: 14px;"><plugin name="Echo" value="org.apache.cordova.plugin.Echo" /></span>
官網爲cordova.exec(...),這裏須要根據2.6的js接口使用做如下修改。json
- <span style="font-size: 14px;">window.echo = function(str, callback) {</span>
- <span style="font-size: 14px;"> <strong>var exec = cordova.require('cordova/exec');</strong>
- <strong>exec</strong>(callback, function(err) {
- callback('Nothing to echo.');
- }, "Echo", "echo", [str]);
- };</span>
- <span style="font-size: 14px;">window.echo("echome", function(echoValue) {
- alert(echoValue == "echome");
- });</span>
另外,對於回調函數調用的線程有三種狀況:
windows
- 若是直接調用,即callbackContext.success(),則在WebCore 線程中執行,而是在UI線程。
- 若是但願在UI線程中直接,須要將回調函數封裝在Runanble中,放在cordova.getActivity().runOnUiThread中執行。
- <span style="font-size: 14px;">cordova.getActivity().runOnUiThread(new Runnable() {
- public void run() {
- ...
- callbackContext.success();
- }
- });
- </span>
- 若是指望在單獨的線程中執行(不至於阻塞WebCore線程),則使用 cordova.getThreadPool().execute方法。
- <span style="font-size: 14px;"> cordova.getThreadPool().execute(new Runnable() {
- public void run() {
- ...
- callbackContext.success();
- }
- });</span>