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. usb serial for android

    /******************************************************************** * usb serial for android * 说明: ...

  2. CSS 实现:文字水平垂直居中

    ☊ [实现要求]: <div class="demo1"> 标题1111 </div> √ [实现]: 方案一:普通布局 .demo1 { text-ali ...

  3. Open vSwitch FAQ (三)

    Quality of Service (QoS) Q: How do I configure Quality of Service (QoS)? A: Suppose that you want to ...

  4. 使用 CUBLAS 库给矩阵运算提速

    前言 编写 CUDA 程序真心不是个简单的事儿,调试也不方便,很费时.那么有没有一些现成的 CUDA 库来调用呢? 答案是有的,如 CUBLAS 就是 CUDA 专门用来解决线性代数运算的库. 本文将 ...

  5. Python 新手常犯错误(第二部分)

    转发自:http://blog.jobbole.com/43826/ 在之前几个月里,我教一些不了解Python的孩子来慢慢熟悉这门语言.渐渐地,我发现了一些几乎所有Python初学者都会犯的错误,所 ...

  6. archlinux设置无线网络连接

    Check the driver $ lspci -k Open the network card $ ip link set <设备名> up Check device status $ ...

  7. 代码管理工具TortoiseSVN

    . TortoiseSVN TortoiseSVN与Windows Explorer集成可称为是一款功能齐全的SVN客户端,允许你管理SVN项目.其自身就包含客户端无需再安装额外的SVN客户端.它还提 ...

  8. 137. Single Number II

    Given an array of integers, every element appears three times except for one. Find that single one. ...

  9. STL概述

    一.关于STL STL(Standard Template Library,标准模板库)是C++语言标准中的重要组成部分.STL 以模板类和模板函数的形式为程序员提供了各种数据结构和算法的精巧实现,程 ...

  10. 课堂所讲整理:HTML--5JavaScript简介

    一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司 ...