1、创建Cordova插件类
新建java类,继承org.apache.cordova.CordovaPlugin。
import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; import org.apache.cordova.CordovaPlugin; import org.apache.cordova.CordovaWebView; import org.json.JSONArray; import org.json.JSONException; public class Demo extends CordovaPlugin { @Override public void initialize(CordovaInterface cordova, CordovaWebView webView) { // TODO Auto-generated method stub super.initialize(cordova, webView); }
@Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { // TODO Auto-generated method stub return super.execute(action, args, callbackContext); }
} |
2、编写插件功能
编写插件功能需要实现在 execute(String action, JSONArray args,CallbackContext callbackContext) 方法。
import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; import org.apache.cordova.CordovaPlugin; import org.apache.cordova.CordovaWebView; import org.json.JSONArray; import org.json.JSONException; public class Demo extends CordovaPlugin { private CordovaInterface cordova; @Override public void initialize(CordovaInterface cordova, CordovaWebView webView) { super.initialize(cordova, webView); this.cordova = cordova; }
@Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
final CallbackContext mCallback = callbackContext;
if("hello".equals(action)){ callbackContext.success("hello cordova!");
//如果处理时较长的话需要使用线程异步处理 /* cordova.getThreadPool().execute(new Runnable() {
@Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } mCallback.success("hello cordova!"); } });*/ } return true; }
} |
先说一下execute返回值:
返回true指的是action命令成功接受(开始)处理,并不是action命令已处理完成。这里js是不会有任何处理的,真到Action完成处理调用 mCallback.success()后返回处理结果,js才会调用成功回调函数处理返回结果。
返回false就是action未成功接受或开始处理(如未知action命令),些时js会调用异步回调函数。
尽量使用异步处理:
插件功能处理如果耗时较长都应该使用异步处理,在execute中开启一个线程,处理完了调用mCallback.success(?)或mCallback.error(?)返回处理结果。
回调:
默认情问下成功调用插件功能必须返回一个结果,通过mCallback.success(?)或mCallback.error(?)回调的方式返回。便也技持无返回,或多次返回。
无回调:
//PluginResult.Status.NO_RESULT 不返回结果 PluginResult pluginResult = new PluginResult(PluginResult.Status.NO_RESULT); //true:回调继续保持,即当前返回后后面还会有返回 false:回调结束,即当这个返回后不会再有返回 pluginResult.setKeepCallback(false); callbackContext.sendPluginResult(pluginResult); |
多次回调:
//PluginResult.Status.OK/ERROR 返回状态。OK:Js调用成功回调方法. ERROR:Js调用异常回调方法 PluginResult pluginResult = new PluginResult(PluginResult.Status.ERROR,"返回结果"); //true:回调继续保持,即当前返回后后面还会有返回 false:回调结束,即当这个返回后不会再有返回 pluginResult.setKeepCallback(true); callbackContext.sendPluginResult(pluginResult); |
3、配置加载插件
在res/xml/config.xml的widget中增加
<feature name="Demo" > <param name="android-package" value="插件类名" ></param> </feature> |
name:为插件名称,在Js调用会使用到
4、js调用插件
通调exec调用
//加载依赖库 var cordova = require('cordova'), exec = require('cordova/exec'); //调用插件功能 exec(successCallback, errorCallback, "Demo", "hello", jsonstr); |
successCallback:成功回调方法
errorCallback:失败回调方法
"Demo":插件名称,配制在config.xml:feature 属性 name;
"hello":action名称
jsonstr:参数,JSON格式
封装成友好的方法调用
demo_plugin.js
cordova.define("com.xxx.plugins.Demo", function(require, exports, module) {
var cordova = require('cordova'), exec = require('cordova/exec'); var Demo= function(){
} Demo.prototype.connect=function(successCallback, errorCallback,jsonstr) { exec(successCallback, errorCallback, "Demo", "hello", jsonstr); }; var demo= new Demo(); module.exports = demo; }); |
在cordova_plugins.js module.exports中增加一项
{ "file": "demo_plugins.js", //插件js路径 "id": "com.xxx.plugins.Demo", //这里使用类名,其他也可以,只要不重复 "clobbers": [ "Demo" //Js插件对像名后,载入后通过这个名称调用 Demo.hello(.....); ] } |
在cordova_plugins.js module.exports.metadata中增加一项
"com.xxx.plugins.Demo": "1.0.0" |
com.xxx.plugins.Demo必须和exports中的id一样。
1.0.0:标识可随意
在HTML中调插件
<script type="text/javascript" src="cordova.js"></script> <!--<script type="text/javascript" src="cordova_plugins.js" ></script>--> |
cordova.js必须引入.
cordova_plugins.js如果和cordova.js在同一目录下,会自动引入。
调用插件:
Demo.hello(function(data) { alert("成功="+data); }, function(err) { alert("失败="+err); },{data:124}); |
-------END-----