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. jQuery实现一个全选复选框联动效果

    类似邮件列表里的复选框 要求双向联动 ☛ [实现]: <body> <div> <input type="checkbox" name="c ...

  2. Linux TC (traffic control)

    在着手学习TC采用如下单位来描述带宽: mbps = 1024 kbps = 1024 * 1024 bps => byte/s mbit = 1024 kbit => kilo bit/ ...

  3. hdu 5093 Battle ships

    二分图匹配 #include<cstdio> #include<cstring> #include<iostream> #include<cmath> ...

  4. 有k个list列表, 各个list列表的元素是有序的,将这k个列表元素进行排序( 基于堆排序的K路归并排序)

    解题思路: 排序方法:多路归并排序 每次将n个list的头元素取出来,进行排序(堆排序),最小元素从堆中取出后,将其所在list的下一个元素 放入堆中,调整堆序列. 函数实现原型: void list ...

  5. C++ Primer : 第十二章 : 动态内存之unique_ptr和weak_ptr

    unique_ptr 一个unique_ptr拥有它所管理的对象,与shared_ptr不同,unique_ptr指向的对象只能有一个用户.当unique_ptr被销毁后,它所指向的对象也被销毁. 定 ...

  6. 【渗透测试学习平台】 web for pentester -3.XSS

    Example 1 http://192.168.91.139/xss/example1.php?name=hacker<script>alert('xss')</script> ...

  7. leetcode 106 Construct Binary Tree from Inorder and Postorder Traversal----- java

    Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  8. URAL 1218 Episode N-th: The Jedi Tournament(强连通分量)(缩点)

    Episode N-th: The Jedi Tournament Time limit: 1.0 secondMemory limit: 64 MB Decided several Jedi Kni ...

  9. spring源码学习之【准备】cglib动态代理例子

    一:委托者 package com.yeepay.porxy.cglib.test; import java.util.HashMap; import java.util.Map; /** * 目标类 ...

  10. Articles Every Programmer Must Read

    http://javarevisited.blogspot.sg/2014/05/10-articles-every-programmer-must-read.html Being a Java pr ...