cordova的android插件开发及cordova加载插件的过程

首先先引用cordova的官方文档(不懂多看官方文档):https://cordova.apache.org/docs/en/8.x/reference/cordova-plugin-device/index.html;这里分为2个部分:第一部分为插件创建,第二部分为cordova加载插件的过程解析。

第一部分:插件创建

这里以创建toast弹窗插件为例

第一步先安装plugman:npm install -g plugman

第二步新建插件项目结构:plugman create --name toastPlugin --plugin_id plugin_id --plugin_version 1.0.0

   创建出来后项目结构为:

          

 然后再src下新建android目录,在该目录先放android代码。

第三步在任意一个cordova的项目中,创建如下class:


package cordova.plugins;

import android.widget.Toast;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;

public class ToastPlugin extends CordovaPlugin {

public boolean execute(String action, String rawArgs, CallbackContext callbackContext) throws JSONException {
final JSONArray args = new JSONArray(rawArgs);
if("toast".equals(action)){
Toast.makeText(cordova.getActivity(),args.getString(0),Toast.LENGTH_SHORT).show();
callbackContext.success();
return true;
}
callbackContext.error("找不到对应方法");
return false;
}
}

  然后将这个java文件copy到插件目录的src/android目录下面,然后修改plugin.xml文件如下:

    <name>toastPlugin</name>
    <js-module name="toastPlugin" src="www/toastPlugin.js">
        <clobbers target="cordova.plugins.toastPlugin" /><!--调用插件的方式:在cordova项目中声明declare cordova,然后cordova.plugins.toastPlugin.方法名 调动插件的方法  -->
    </js-module>

    <!--添加Android平台  -->
    <platform name="android">
        <config-file target="res/xml/config.xml" parent="/*">  
            <!-- JS调用时的名字,与上面的clobbers相同 -->
            <feature name="toastPlugin">  
                <!-- value:的值是对应的插件中ToastPlugin.java存放的路径 --> 
                <param name="android-package" value="cordova.plugins.ToastPlugin"/>
            </feature>  
        </config-file>  
        <!-- src:是插件里存放对应.java的路径, target-dir:安装插件时把.java文件存放的位置,要和上面的value路径对应 -->
        <source-file src="src/android/ToastPlugin.java" target-dir="src/cordova/plugins" />
    </platform>

在修改www目录下面的toastPlugin.js文件:

var exec = require('cordova/exec');

exports.toast = function (arg0, success, error) {
    exec(success, error, 'toastPlugin', 'toast', [arg0]);
};

然后再插件根目录执行:npm init,可以按照自己的信息填写(只做demo就一直点Enter就可以了),生成package.json文件。至此插件开发完成,下面测试:

安装插件:ionic cordova plugin add D:\mobile\plugins\toastPlugin       //这里为你新建的插件的目录

然后declare cordova,在代码中加入    cordova.plugins.toastPlugin.toast("测试toast插件");

第二部分:cordova加载插件过程解析

首先用androidStudio打开项目结构应该如下(不建议用eclipse):

    

找到engine下的PluginManager的exec方法(看懂该方法就懂加载过程了),该方法第一步就调用了如下方法:

   

查看该方法发现cordova从pluginMap和entryMap查询插件的class的地址,查找到了没有初始化插件就初始化插件(有个配置可以在cordova ready的时候就初始化我们的插件,不然默认调用时在初始化);

在PluginManager中查找发现pluginMap就是entryMap中已经初始化了的插件,接着找entryMap的初始化位置

 

发现是方法setPluginEntries初始化entryMap,在向上找发现是PluginManager初始化,-----》发现PluginManager是在CordovaWebViewImpl的init中创建----》发现在CordovaActivity的init方法中

pluginEntries就是plugin的集合,那在找它初始化的位置,发现是在ConfigXmlParser中parse方法解析配置文件的来的,解析位置就是这里

打开对应目录就会发现是上面创建插件时plugin.xml的feature的配置,到此就找到了插件。

 

 然后回PluginManager的exec方法,接着执行就完了。

 

 所有整个顺序为:CordovaActivity初始化时加载res/xml/config.xml的配置,然后初始化CordovaWebViewImpl----->PluginManager;

 

posted @ 2018-11-21 16:40  fantastiLi  阅读(60)  评论(0)    收藏  举报