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>