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. java学习第十天

    第十二次课 目标 一维数组(创建访问) 一.概念与特点 1.概念 相同数据类型的有序集合[] 数组名: 容器的名字 元素:  下标变量,数组名[下标] 长度:  length 下标:   位置.索引  ...

  2. sql(join on 和where的执行顺序)

    left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录. inner join: 内连接,又 ...

  3. Eclipse中设置JDK内存方式

    (1) 打开Eclipse,双击Serveers进入到servers编辑画面 (2) 点击 Open launch configuration 选项 (3) 选项中找到Arguments 的选项卡(t ...

  4. OOP初学小结

    最近刚刚开始学python的OOP,感觉不太适应.一些很简单的程序也卡了好半天才能调好- 其中的一个错误是:将两个不同的类的方法互相调用,结果走进死循环- 另外就是debug的时候,不要在那里空空地望 ...

  5. dalvik虚拟内存管理之二——垃圾收集

    转载自http://www.miui.com/thread-75028-1-1.html 垃圾收集是dalvik虚拟机内存管理的核心,垃圾收集的性能在很大程度上影响了一个Java程序内存使用的效率.顾 ...

  6. editplus查找替换的正则表达式应用

    表达式        说明\t        制表符.\n        新行..        匹配任意字符.|        匹配表达式左边和右边的字符. 例如, "ab|bc" ...

  7. android WebView交互优化

    安卓的WebView一般是嵌套在activity或者fragment中的,但是如果在这种activity页面上点击返回按钮,一般会finish掉当前activity.其实是应该关闭当前的WebView ...

  8. Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现(转)

    Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现 zouxy09@qq.com http://blog.csdn.net/zouxy09          自己平时看了一些论文, ...

  9. 264. Ugly Number II

    Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...

  10. Javascript模块化编程(一):模块的写法【转】

    作者: 阮一峰 日期: 2012年10月26日 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分 ...