1、问题描述
在我之前写过一篇文章:Cordova6.1、ionic、android交互自定义插件
http://blog.csdn.net/qq417431233/article/details/51242080
虽然这篇文章可以解决自定义插件的问题,但是出现了如下的问题,如果只要
cordova build,数据立即被抹去,插件就会消失;
因此,3以后要添加插件,需要用 cordova plungin add “你本地插件的路径” 的方式来添加插件;
2、准备cordova plungin需要素材、文件;
2.1 新建一个文件夹
命名为你插件的名字,如DivShow,我是放在了桌面;
2.2 在文件夹里再新建2个文件夹和1个文件
两个文件夹分别是src和www.其中src中放你插件的java代码,www中放对应的js文件;与src和www文件夹同级,建立plugin.xml
如下图,就是三个文件的位置效果;
3、cordova plugin 主要是三个文件讲解和配置
3.1、继承cordovaActivity的Native实现类,DivShow\src\DivPlugin.java
package com.hsz.overseas.divplugin.divshow;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;
import com.hsz.overseas.activity.ShowGoodsActivity;
import android.content.Intent;
import android.widget.Toast;
public class DivPlugin extends CordovaPlugin {
@Override
public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException
{
//匹配的是方法的名字
if (action.equals("toastShow")) {
final String message = args.getString(0);
//没有调用主线程的UI更新,只是处理相关的
cordova.getThreadPool().execute(new Runnable() {
public void run() {
Intent intent = new Intent();
intent.setClass(webView.getContext(), ShowGoodsActivity.class);
cordova.getActivity().startActivity(intent);
}
});
return true;
}
return false;
}
private void echo(String message, CallbackContext callbackContext) {
if (message != null && message.length() > 0) {
callbackContext.error(message);;
} else {
callbackContext.success(message);
}
}
}
这段代码不多解释,主要在上一遍文章中有解释,就是js 调用到android原生的类和方法;
3.2、编写javascript代码,www\divshow.js
var exec = require('cordova/exec');
module.exports = {
/**
* 一共5个参数
第一个 :成功会掉
第二个 :失败回调
第三个 :将要调用的类的配置名字(在config.xml中配置 稍后在下面会讲解)
第四个 :调用的方法名(一个类里可能有多个方法 靠这个参数区分)
第五个 :传递的参数 以json的格式
*/
toastShow: function(mills) {
exec(function(winParam){
console.log(winParam);
// alert(winParam);//执行成功,android 返回的数据,是类中callbackContext.success传递的参数</span>
},function (errorParam) {
console.log(winParam);
// alert(errorParam);
}, "DivShow", "toastShow", [mills]);
},
};
现在是这样的,也不解释,上篇文章已经介绍过了。具体含义;
主要就是在使用cordova plugin add “本地自定义插件代码”以后,最外层会加上如下的代码;
注意:
为什么会这样呢,define的名字会在3.3中有解释;
cordova.define("com.hsz.overseas.divplugin.divshow.DivShow", function(require, exports, module) {
......
});
效果如下图:
3.3、编写plugin.xml配置文件
文件的配置主要居中在这里,这里就是将上述的两份文件映射到www文件/android中;如下是比较简单的配置,只是配置了android;而且没有配置权限等,主要这次没有使用到权限;代码中也有相应的解释;
<?xml version="1.0" encoding="utf-8"?>
<!--插件id号,与package.json保持一致 版本号,与package.json保持一致,也可以说不太紧要的
id+name 就是上面的cordova.define()中的参数名字;
-->
<plugin id="com.hsz.overseas.divplugin.divshow" version="0.0.1"
xmlns="http://apache.org/cordova/ns/plugins/1.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<name>DivShow</name>
<description>js to android showToast and dialog</description>
<js-module name="DivShow" src="www/divshow.js">
<!--插件在js中调用的类名,cordova.div.show.toastShow.*()-->
<clobbers target="cordova.div.show.toastShow"/>
</js-module>
<platform name="android">
<config-file parent="/*" target="res/xml/config.xml">
<!--插件在java端的接口名称,与之前文件中的接口名称保持一致,在res/xml/config.xml的name-->
<feature name="DivShow">
<!--该插件接口对应的java代码路径,src/com.hsz.overseas.divplugin.divshow.DivPlugin -->
<param name="android-package" value="com.hsz.overseas.divplugin.divshow.DivPlugin"/>
</feature>
</config-file>
<!--源文件的路径和目标文件路径,src为已经编写好的java代码路径,
target-dir为需要生成的android工程中该java源码路径,与上面的java代码路径保持一致-->
<source-file src="src/DivPlugin.java" target-dir="src/com/hsz/overseas/divplugin/divshow"/>
</platform>
</plugin>
如果还要配置android的权限的话,可以添加如下的代码:
<platform name="android">
......
<!--该插件需要的权限申明,根据需要自行定义-->
<config-file target="AndroidManifest.xml" parent="/*">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
</config-file>
........
</platform>
4、执行命令,添加新的插件进android和www项目
cordova plugin add DivShow#目录名称,也可以是 git 的地址
我的路径是在桌面,所以如下:
cordova plugin add C:\Users\Administrator\Desktop\DivShow
5、生成的文件和解释
执行了上述的命令以后,会自动生成有的一些文件比如:
比如android方面:
src/com.hsz.overseas.divplugin.divshow.DivPlugin.java ;
res/config.xml中添加参数 ;
www方面:
assets/plugins/com.hsz.overseas.divplugin.divshow/www/divshow.js ;
assets/plugins/cordova_plugins.js z中添加了module.exports中;
关系解释,下面解释:
5.1、android和plugin.xml配置文件相互的对应
截图如下:
5.2、www和plugin.xml配置文件相互的对应
截图如下:
5.3、ionic controller中的调用
$scope.toastShow=function () {
cordova.div.show.toastShow.toastShow('d');
};
再来一幅图的效果解释为什么是这样;
如有其他疑问或者不懂的地方,请留言!!!
我写好的代码如下,请参考;
http://download.csdn.net/detail/qq417431233/9524278