做了快一年的cordova混合开发,最近终于有空来了解cordova插件了。毫无疑问,cordova插件家族是很丰富的。github上一搜索就是一大堆,虽说不要重复造轮子,但是有些东西你总得去了解它运行的原理。所以今天我们来试着开发一个最基础的基于Android的Toast插件
前期准备:一个Android项目,一个cordova项目。这里,本人选择了自己喜欢的几个工具用于编辑cordova插件,分别是:WebStrom、Eclipse、GapDebug。
插件实现原理:这里百度了一张图片。可以简单的了解一下。其实就是前台js发送一个消息,后台调用原生代码实现原生功能,如打开摄像头,打开本地文件等

既然要开发原生插件,那么毫无疑问,咱们的原生代码得没问题才行。这就好比地基都没有,房子咋造?空中楼阁么。。。。哈哈哈,扯远了
一.新建Android项目
首先,新建一个Android项目,可以选用Eclipse,或android studio。根据个人喜好自己确定。因为习惯于Eclipse。这里就直接用eclipse建个项目了。项目名称叫TestToast

点击next,一直点到最后一步,新建一个Empty Activity。

完成后直接找到src目录下,打开MainActivity。编辑一下我们自己的Android项目。然后编写代码。这里因为只要演示一下,我就只写了一个简单的toast了。编写完成后运行,确定没问题就可以进行下一步了。接下来要写一个自定义ToastDemo.java类实现。这里需要引用cordovaLib这个外部依赖包,我们先赖创建一个cordova项目,这样才能拿到这个lib包
二.创建cordova项目
1.打开windows控制台,新建一个cordova项目。并添加Android平台

2.完成之后找到项目目录下platforms\android。可以看到下面有一个CordovaLib文件夹,打开之后你会发现其实它就是一个Android项目。将该项目导入Eclipse,然后再在我们原来的TestToast项目里面添加依赖该项目。TestToast项目右键->properties->Android->add。完成后如下所示

3.添加完成后在src目录下新建一个TestDemo.java类,继承CordovaPlugin。注意,我们写的所有插件都要继承CordovaPlugin。然后重写execute方法。在方法里面写要操作的原生代码。

对于自定义插件类,额外补充以下两点:
关于args值取用方式
a) 如果js传入的如果是对象数组,即[{“key”:”value”,”key”:”value”}],则如下取用:
JSONArray jsonarr = new JSONArray(args.getString(0));
JSONObject json = jsonarr.getJSONObject(0);
String str = json.get("key");
b) 如果js传入的如果是普通数组,即["a",10,true,…],则如下取用:
args.getString(0)
args.getInt(1)
args.getBoolean(2)
关于该方法的参数介绍
a) action 要执行的方法
b) args 传入参数。
c) callbackContext 当执行完成时要返回参数时候使用该方法
到这里,我们的java代码基本上已经准备就绪,下面就来写js接口
三.原生插件接入cordova
1.安装plugman:npm install -g plugman
2.plugman安装完成后就可以创建插件了
plugman create --name <pluginName> --plugin_id <pluginID> --plugin_version <version> [--path <directory>] [--variable NAME=VALUE]
参数:
pluginName: 插件名字
pluginID: 插件id, egg : coolPlugin
version: 版本, egg : 0.0.1
directory:一个绝对或相对路径的目录,该目录将创建插件项目
variable NAME=VALUE: 额外的描述,如作者信息和相关描述
egg : plugman create --name CoolPlugin --plugin_id coolPlugin --plugin_version 0.0.1
执行命令:plugman create --name toast --plugin_id hld.taost --plugin_version 1.0.0
添加成功后在该目录下面可看到一个toast的文件夹,打开后可看到如下文件

目录结构大致如下

这里有必要解释一下这几个目录的意思
a) src 用于存放各个平台的本地代码,我的只有Android平台的,所以只有一个android文件夹。
b) www 用于存放js文件,js文件主要做接口用
c) plugin.xml 文件是插件的配置文件,至关重要。
插件魔板生成成功后,我们开始配置cordova插件内容。前期我们已经新建了一个cordova项目,用webstrom打开,然后复制刚刚创建的插件到这个目录下。第一步,将之前在Android工程中写的MyToast.java文件复制到插件的android目录下。由于这里只用到了一个Toast。其他包括布局啊,什么的都用不到,所以就只有一个.java文件,如果有用到布局啊,外部jar包之类的话,还需要将其统统都拷贝到android目录下。

复制完成后打开webstrom。可以看到如下目录结构。toast文件夹就是刚刚新建的文件夹。
重要时刻来了,之前就是这里配置错误,弄了很久终于解决了。
1)配置toast.js
var exec = require('cordova/exec');
exports.toast = function(args,success,error){
exec(success,error,'MyToast','toast',[args]);
}
第一行是固定格式,照着写就行了。第二行中的toast为前台调用时候的方法名。解释一下exec();方法
success:成功后执行的方法
error:失败后执行的方法
MyToast:这个参数不太清楚。不过最好配置的和原生类名一致。
toast:还记得写原生JAVA代码是传入的那个action的值么,没错,就是它!贴一张图

args:传入参数
toast.js里面大概就这么几个内容。接下来就是plugin.xml了,其实cordova插件的核心就是这个plugin.xml了。

这个配置我也不太清楚,都是照着模板来的。根据经验,其中有一个name节点。不知道是否对应着刚刚toast里面的那个exec方法里面的第三个参数MyToast。有兴趣可以验证一样。
platform:需要配置一个name,也就是对于哪个平台,我们都知道cordova厉害之处就在于跨平台。所以这里我们写android,因为我们的插件就只支持Android嘛。
config-file:固定格式
feature:这里面的Name应该可以随意取的吧,不清楚。最好配置的和最上面的name一致。
source-file:这里其实就是把插件里面的文件复制到对应的Android原生工程里面的那个路径,哪个文件夹去。因为这里就只有一个java文件,所以写上就好了。src路径写上插件的路径。target-dir:这里写刚刚MyToast.java的包名。
所有东西都配置完成后,就可以添加插件到cordova项目中了。
四.插件集成到cordova项目中
进入控制台,执行命令cordova plugin add toast。注意:执行的目录必须要是在一个cordova项目的目录下,且当前目录下有toast插件。这样才能添加成功

完成之后我们在首页调用,调用的方法如下:
<script>
function myFunction() {
cordova.plugins.MyToast.toast({message:'原生toast'},function () {
},function(){
});
}
</script>
有人可能会问,为什么是cordova.plugins.MyToast.toast。而不是其他的方式。如果刚刚你细心一点的话,就会发现。cordova.plugins.MyToast这串字符,其实也就是刚刚的plugin.xml里面配置的
<clobbers target="cordova.plugins.MyToast" />。这里想改成其他的也可以。
添加完成之后打包就可以了使用了。可以看到。弹出了我们原生的toast

其实,cordova真正厉害之处就在于插件了,基本上只要原生能做到的,它都能做到。而且网上的插件一大堆。想要什么直接搜素一下就拿到了。下面放上该项目的地址。插件在项目路径下的toast文件夹里面
项目github地址:https://github.com/luofuxian/Androidtoast




