Phonegap为跨设备的应用开发提供了一个解决方案。如果某个应用只有js和html,则可以通过Phonegap的在线build工具,编译出多个平台的app安装包。当然通过Phonegap提供的js可以访问部分设备的资源,如网络连接(Connection)、相机(Camera)、文件(File)、存储(Storage)等,具体可以参看Phonegap开发文档。但很多Android应用,仅仅使用这些资源是满足不了需求的,所以必然需要访问本地接口的方法。

初步实验,至少有两个方法可以访问本地的接口。

对于第一种方法,虽然官方已经提供了教程,但我认为还是有必要梳理一下流程,因为官网的教程忽略了由于升级需要的更改。

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

添加以下代码

  1. <span style="font-size: 14px;"><plugin name="Echo" value="org.apache.cordova.plugin.Echo" /></span>
  • 为windows(或者其他对象)添加echo方法

官网为cordova.exec(...),这里需要根据2.6的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调用接口
  1. <span style="font-size: 14px;">window.echo("echome", function(echoValue) {
  2. alert(echoValue == "echome"); // should alert true.
  3. });</span>

另外,对于回调函数调用的线程有三种情况:

  • 如果直接调用,即callbackContext.success(),则在WebCore 线程中执行,而是在UI线程。
  • 如果希望在UI线程中直接,需要将回调函数封装在Runanble中,放在cordova.getActivity().runOnUiThread中执行。
  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方法。
      1. <span style="font-size: 14px;"> cordova.getThreadPool().execute(new Runnable() {
      2. public void run() {
      3. ...
      4. callbackContext.success(); // Thread-safe.
      5. }
      6. });</span>

Phonegap通过JS访问本地接口的两种方法的更多相关文章

  1. Js 字符串拼接的两种方法

    字符串拼接的两种方法 用数组的方法的好处是:避免变量重新定义.赋值 <!DOCTYPE html> <html lang="en"> <head> ...

  2. Android访问WebService的两种方法

    首先解释一下WebService:WebService是一种基于SOAP协议的远程调用标准.通过WebService可以将不同操作系统平台,不同语言.不同技术整合到一起.详细见:http://baik ...

  3. js循环遍历的两种方法for循环和for ... in 循环

    JS数组的遍历方法有两种: 第一种:一般的for循环,例如: var a = new Array("first", "second", "third& ...

  4. 实现SQL Server 2008 Reporting Services匿名访问报表有两种方法

    一.通过修改SQL Server 2008的配置文件,去掉Windows的验证. 1.首先我们找到SQL安装目录下的两个Web.config配置文件,默认安装目录分别是(C:\Program File ...

  5. c#访问数据库的两种方法以及事务的两种方法

    //2015/07/03 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...

  6. js 数组去重复两种方法一看就懂

    var arr=[1,1,2,2,3,5,2];function uniqueArr(arr){ var data=[]; for(var i=0;i<arr.length;i++){ if(d ...

  7. iframe-父子-兄弟页面相互传值(jq和js两种方法)

    参考文章: http://blog.csdn.net/u013299635/article/details/78773207 http://www.cnblogs.com/xyicheng/archi ...

  8. js如何动态创建表格(两种方法)

    js如何动态创建表格(两种方法) 一.总结 一句话总结: 1.方法一:写好创建表格的html代码,将之赋值给div的innerHTML. 2.方法二.直接用创建好的table元素的方法insertRo ...

  9. MyEclipse取消验证Js的两种方法

    MyEclipse取消验证Js的两种方法 作者: 字体:[增加 减小] 类型:转载 通过js写一个web工程的相关页面时感觉很卡,修改内存也不行下面有两种解决方法,大家可以尝试下 前言:有时我们通过j ...

随机推荐

  1. HDFS+MapReduce+Hive+HBase十分钟快速入门

    1.     前言 本文的目的是让一个从未接触Hadoop的人,在很短的时间内快速上手,掌握编译.安装和简单的使用. 2.     Hadoop家族 截止2009-8-19日,整个Hadoop家族由以 ...

  2. asp.net网站 提示Ambiguous match found

    在ASP.net中,每个aspx页面都会有一个.cs文件,(好像不可以多个aspx共用一个cs的,我前面就碰到这个问题), 在aspx页面中,我们会用到服务器控件,或html控件,这些控件的id命名时 ...

  3. [转载] C++位运算:将一个4字节整数的二进制表示中的001替换为011

    #include <iostream> #include <assert.h> /** * Key: * * get someone bit: num & (mode1 ...

  4. Codeforces Round #375 (Div. 2) A B C 水 模拟 贪心

    A. The New Year: Meeting Friends time limit per test 1 second memory limit per test 256 megabytes in ...

  5. Codeforces Round #366 (Div. 2) B 猜

    B. Spider Man time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  6. Windows 10触摸板手势

    高級使用者試用 Windows 10 筆記本電腦的觸控板上的這些手勢: •選擇一項: 在觸控板上點擊. •滾動: 將兩根手指放在觸控板上,然後以水準或垂直方向滑動. •放大或縮小: 將兩根手指放在觸控 ...

  7. install gcc under suse

    SUSE 11中安装GCC开发环境 SUSE11中安装GCC开发环境 安装包下载网站:http://213.174.32.130/sles/distribution/11.0-SP1/repo/dis ...

  8. 点亮LED(库函数实现)

    本次测试采用的芯片是STM32F103CB 我的开发板如下: 此开发板有8个led,分别为D11,D12,D13,D14,D15,D16,D17,D18.查询核心板的电路图后知道其对应芯片的控制引脚为 ...

  9. Java 操作Excel 之Poi(第一讲)

    1.Poi 简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能.HSSF - 提供读写Micros ...

  10. caffe 训练时,出现错误:Check failed: error == cudaSuccess (4 vs. 0) unspecified launch failure

    I0415 15:03:37.603461 27311 solver.cpp:42] Solver scaffolding done.I0415 15:03:37.603549 27311 solve ...