除了使用Cordova官方的插件外,我们也可以自己写插件,来满足业务需求。
在Android平台,每个插件都有两部分组成:
插件的JavaScript文件
插件的JAVA类
创建插件的JavaScript
插件所在的目录assets/www/plugins/,如果你添加了Cordova的插件,可以看到下图
可以看到Cordova自己的插件都定义在,以其包名命名的文件夹下的www目录中,我们也按照此约定创建JS,指定包名为 com.test.plugin。
JS内容如下:
// "com.test.plugin.PluginTest"指定的是此插件的ID
cordova.define("com.test.plugin.PluginTest", function (require, exports, module) {
var exec = require('cordova/exec');
function PluginTest() {
}
PluginTest.prototype = {
test1: function (params, successCallback, errorCallback) {
// 第三个参数是插件的名称,必须与config.xml文件中的feature.name保持一致
exec(successCallback, errorCallback, "PluginTest", "test1", [params]);
},
test2: function (params, successCallback, errorCallback) {
exec(successCallback, errorCallback, "PluginTest", "test2", [params]);
}
}
module.exports = new PluginTest();
});
创建插件的JAVA类
继承CordovaPlugin类,并重写其execute方法,约定:类中的方法名与js中的方法名保持一致,方便查找。
package com.test.plugin;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;
import android.widget.Toast;
public class PluginTest extends CordovaPlugin {
/**
* 必须重写execute方法
*/
@Override
public boolean execute(String action, JSONArray args,
CallbackContext callbackContext) throws JSONException {
if("test1".equals(action)) {
this.test1(args, callbackContext);
}else if("test2".equals(action)) {
this.test2(args, callbackContext);
}else{
return false;
}
return true;
}
private void test1(JSONArray args, final CallbackContext callbackContext)
throws JSONException {
// 开启worker线程
cordova.getThreadPool().execute(new Runnable() {
@Override
public void run() {
System.out.println("Execute test1 method");
callbackContext.success("执行成功回调");
}
});
}
private void test2(JSONArray args, final CallbackContext callbackContext)
throws JSONException {
// 在UI线程上执行
cordova.getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(cordova.getActivity(), "Execute test2 method", Toast.LENGTH_SHORT).show();
callbackContext.error("执行失败回调");
}
});
}
}
配置插件
下面是配置插件,让Cordova知道我们写了个插件。
打开res/xml/config.xml文件,添加一个feature:
Cordova会解析config.xml文件,每个feature就是一个plugin.
key
desc
feature.name
plugin的名称
android-package
指定插件的java类,必须是含包名的完整命名
onload
为true,表示webview在加载html时,是否加载此插件。默认为false,当要使用此插件时,再去加载
到这里插件就完成了,可以在JS中调用插件的方法了。