phonegap/Cordova和android自定义插件模块,cordova build后插件不会消失

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值