理清cordova插件的调用流程
- 从调用的角度看流程

前端调用(clobbers)——>cordova_plugins.js(clobbers对应插件id和插件文件所在的路径)—–>js部分(配置着插件的名字,已经插件里面都有的方法)——>config.xml(根据插件的名字找到对应的插件原生文件的包名)——>原生(根据匹配到的方法名,来调用原生方法,另外也可以获取到js传递下来的参数)
简单说:前端调用——>桥梁:(cordova_plugin.js clobbers)—->js文件——>桥梁:(config.xml 插件名)—–>原生
- 关键1:前端接口:cordova.plugins.QtPlugin 是插件的clobbers,在cordova_plugins.js里面配置,get是插件提供的方法之一,在插件的js文件里面有
function GetToken(key, success, failed){document.addEventListener('deviceready', function(){cordova.plugins.QtPlugin.get(key,success,failed);}, false);}
- 关键2:cordova_plugins.js:配置插件clobbers,已经对应的插件id和插件js文件的路径
"file": "plugins/com.qt.cordova.plugin/www/qtplugin.js","id": "com.qt.cordova.plugin.QtPlugin","clobbers": ["cordova.plugins.QtPlugin"]
- 关键3:js部分,这里是插件的id
cordova.define("com.qt.cordova.plugin.QtPlugin", function(require, exports, module) {
- 关键4:js部分,这里是插件的名字,以及插件的方法
QtPlugin.prototype.save = function(key,value,success, error){exec(success, error, "QtPlugin", "save", [key,value]);};QtPlugin.prototype.get = function(key,success, error){exec(success, error, "QtPlugin", "get", [key]);};
- 关键5:config.xml:插件名对应的原生代码的包名
<feature name="BarcodeScanner" ><paramname="android-package"value="com.phonegap.plugins.barcodescanner.BarcodeScanner" /></feature>
- 关键6:原生代码:匹配到方法,调用原生方法saveDate()
if ("save".equals(action)) {System.out.println("save被调用");cordova.getThreadPool().execute(new Runnable() {public void run() {String key = args.optString(0);String value = args.optString(1);saveDate(key, value);}});}
关于cordova插件要注意5个部分
第一部分:原生代码部分:匹配js方法,调用需要的原生方法
public boolean execute(String action, final CordovaArgs args,final CallbackContext callbackContext) throws JSONException {//save方法,给前端调用用来保存key value形式的键值对if ("save".equals(action)) {System.out.println("save被调用");cordova.getThreadPool().execute(new Runnable() {public void run() {String key = args.optString(0);String value = args.optString(1);saveDate(key, value);}});}//get方法,给前端调用用来获取指定key对应的value值else if ("get".equals(action)) {//get会被调用两次,一次获取用户名,另外一次获取密码System.out.println("get被调用");String key = args.optString(0);System.out.println("get被调用key:" + key);String values = PrefUtils.getString(MyApplication.ctx, key, "");// 从sp取System.out.println("返回的values:" + values);callbackContext.success(values);} else if ("getLocalVersion".equals(action)) {JSONObject json = new JSONObject();String localVer = DeviceUtil.getVersionName(context);if (!localVer.equals("")) {json.put("localVer", localVer);json.put("platform", "android");callbackContext.success(json);return true;} else {json.put("code", 107);json.put("msg", "获取本地版本号失败");callbackContext.error(json);}}
2、config.xml:插件名和插件名对应的原生代码文件
<feature name="Whitelist" ><paramname="android-package"value="org.apache.cordova.whitelist.WhitelistPlugin" /><paramname="onload"value="true" /></feature><feature name="BarcodeScanner" ><paramname="android-package"value="com.phonegap.plugins.barcodescanner.BarcodeScanner" /></feature><!-- QtPlugin是插件名字,com.plugins.qt.QtPlugin是插件原生代码的文件包名--><feature name="QtPlugin" ><paramname="android-package"value="com.plugins.qt.QtPlugin" /></feature><feature name="InAppBrowser"><param name="android-package" value="org.apache.cordova.inappbrowser.InAppBrowser" /></feature><preference name="Splashscreen" value="screen" /><preference name="SplashScreenDelay" value="15000" /><feature name="SplashScreen"><param name="android-package" value="org.apache.cordova.splashscreen.SplashScreen" /><param name="onload" value="true" /></feature><!-- app在pause后不会停止代码--><preference name="KeepRunning" value="false"/><!-- app在pause后不会停止代码--><preference name="KeepRunning" value="false"/>
第三部分:cordova_plugins.js, 插件id和插件的js文件对应,另外clobbers是前端调用的时候使用的,这样就相当于前端调用clobbers,然后就会找到对应的js文件
cordova.define('cordova/plugin_list', function(require, exports, module) {module.exports = [{"file": "plugins/cordova-plugin-whitelist/whitelist.js","id": "cordova-plugin-whitelist.whitelist","runs": true},{"file": "plugins/phonegap-plugin-barcodescanner/www/barcodescanner.js","id": "phonegap-plugin-barcodescanner.BarcodeScanner","clobbers": ["cordova.plugins.barcodeScanner"]},{"file": "plugins/cordova-plugin-splashscreen/www/splashscreen.js","id": "cordova-plugin-splashscreen.SplashScreen","clobbers": ["navigator.splashscreen"]},{"file": "plugins/com.qt.cordova.plugin/www/qtplugin.js","id": "com.qt.cordova.plugin.QtPlugin","clobbers": ["cordova.plugins.QtPlugin"]},{"id": "cordova-plugin-inappbrowser.inappbrowser","file": "plugins/cordova-plugin-inappbrowser/www/inappbrowser.js","pluginId": "cordova-plugin-inappbrowser","clobbers": ["cordova.InAppBrowser.open","window.open"]}];module.exports.metadata =// TOP OF METADATA{"cordova-plugin-whitelist": "1.2.1","phonegap-plugin-barcodescanner": "4.1.0","cordova-plugin-splashscreen": "3.1.0","com.qt.cordova.plugin":"1.0.0","cordova-plugin-inappbrowser": "1.6.1"};// BOTTOM OF METADATA});
第四部分 js文件部分
<!-- com.qt.cordova.plugin.QtPlugin 这是插件的id,在cordova_plugins.js里面配置了-->cordova.define("com.qt.cordova.plugin.QtPlugin", function(require, exports, module) {var exec = require('cordova/exec');function QtPlugin(){};//一、消息通知QtPlugin.prototype.noticeAlert = function(enable){exec(null,null,"QtPlugin", "noticeAlert", [enable]);};QtPlugin.prototype.noticeSound = function(enable){exec(null,null,"QtPlugin", "noticeSound",[enable]);};QtPlugin.prototype.noticeVibrate = function(enable){exec(null,null,"QtPlugin", "noticeVibrate", [enable]);};QtPlugin.prototype.getAlertStatus = function(success){exec(success,null,"QtPlugin", "getAlertStatus", []);};//二、保存数据QtPlugin.prototype.save = function(key,value,success, error){exec(success, error, "QtPlugin", "save", [key,value]);};QtPlugin.prototype.get = function(key,success, error){exec(success, error, "QtPlugin", "get", [key]);};//三、更新QtPlugin.prototype.getLocalVersion = function(success,error){exec(success,error,"CheckUpdate","getLocalVersion",[]);};QtPlugin.prototype.updateH5 = function(success,error){alert("updateH5");exec(success,error,"QtPlugin","updateH5",[]);};QtPlugin.prototype.update = function(url,error){exec(null,error, "QtPlugin","update", [url]);};//四、UserInfoQtPlugin.prototype.setUser = function(userInfo){exec(null,null,"QtPlugin", "setUser", [userInfo]);};QtPlugin.prototype.getUser = function(success){exec(success,null,"QtPlugin", "getUser", []);};QtPlugin.prototype.getDeviceInfo = function(success){exec(success,null,"QtPlugin", "getDeviceInfo", []);};//五、网大QtPlugin.prototype.wdStudy = function(studyInfo,success, error){exec(success, error, "QtPlugin", "wdStudy", [studyInfo]);};var qtPlugin = new QtPlugin();module.exports = qtPlugin;});
第五部分前端调用
// key 是字符串, success成功回调,有一个参数,参数为key对应的value字符串,failed为失败回调function GetToken(key, success, failed){document.addEventListener('deviceready', function(){cordova.plugins.QtPlugin.get(key,success,failed);}, false);}/*调用闪屏插件*/document.addEventListener("deviceready", onDeviceReady, false);function onDeviceReady() {navigator.splashscreen.hide();}/*网大学习app接口 */function WdStudy(studyInfo, success, failed){document.addEventListener('deviceready', function(){cordova.plugins.QtPlugin.wdStudy(studyInfo,function(date){success(date);},function(error){failed(error.code,error.msg);});}, false);}
前端开发使用接口:在index.js里面引入接口文件后,直接用window.方法就可以
代码中调用:window.WdStudy && window.WdStudy(studyInfo, () => {}, () => {});
- 举例:
- 提供的接口
function goThirdSite(url, start, stop, error){document.addEventListener('deviceready', function(){if(!cordova.InAppBrowser){error(0)}else {var inAppBrowserRef =cordova.InAppBrowser.open(url, '_blank', 'location=no');inAppBrowserRef.addEventListener('loadstart', start);inAppBrowserRef.addEventListener('loadstop', stop);inAppBrowserRef.addEventListener('loaderror', function(params){error(1, params)inAppBrowserRef.close()inAppBrowserRef = undefined});}}, false);}
- 调用
jump = (url) => {window.goThirdSite && window.goThirdSite(url, () => {}, () => {}, (code, params) => {if (code === 0) {this.props.warning('暂未开放此功能')} else {this.props.warning('加载失败')console.log(params)}})}
理清cordova插件的调用流程的更多相关文章
- Cordova入门系列(三)Cordova插件调用 转发 https://www.cnblogs.com/lishuxue/p/6018416.html
Cordova入门系列(三)Cordova插件调用 版权声明:本文为博主原创文章,转载请注明出处 上一章我们介绍了cordova android项目是如何运行的,这一章我们介绍cordova的核心 ...
- Cordova入门系列(三)Cordova插件调用
版权声明:本文为博主原创文章,转载请注明出处 上一章我们介绍了cordova android项目是如何运行的,这一章我们介绍cordova的核心内容,插件的调用.演示一个例子,通过cordova插件, ...
- [Phonegap+Sencha Touch] 移动开发76 让cordova app訪问远端站点也能调用cordova插件功能
原文链接:http://blog.csdn.net/lovelyelfpop/article/details/50735395 我相信.应该会有一些cordova开发人员想过实现以下这种app: 使用 ...
- 对cordova插件配置文件plugin.xml的理解
1.配置文件表头包括了插件id,是用于唯一标识插件的.同时插件配置了一个插件名称. 2.这个文件从工作机制,也就是js代码一直到native的java插件代码工作分成两个流程.第一个流程是从代码到插件 ...
- Cordova与现有框架的结合,Cordova插件使用教程,Cordova自定义插件,框架集成Cordova,将Cordova集成到现有框架中
一.框架集成cordova 将cordova集成到现有框架中 一般cordova工程是通过CMD命令来创建一个工程并添加Android.ios等平台,这样的创建方式可以完整的下载开发过程中所需要的的插 ...
- Cordova-在现有iOS工程自动化接入Cordova插件
模拟Cordova插件命令 自己编写脚本,了解cordova添加插件做了哪些事情. 上一篇文章了解到,web与native的交互主要是cordova.js中的exec方法调用,触发交互事件.UIWeb ...
- 自定cordova插件笔记demo
1.在项目根目录下(我的是com.chl),添加一个文件夹,在文件夹里添加src.www两个子文件夹和plugin.xml文件.在www目录下,创建test.js.在src文件夹下添加android子 ...
- cordova插件iOS平台实战开发注意点
cordova插件是其设计理念的精髓部分,创建并使用自定义插件也是一件比较容易的事.但在这个过程中也容易进入一些误区或者有一些错误的理解,下面从笔者实际开发中遇到的问题出发,对其中的一些注意点和重要概 ...
- InnoDB主要数据结构及调用流程
InnoDB主要数据结构及调用流程 InnoDB是MySQL中常用的数据引擎.本文将从源码级别对InnoDB重点数据结构和调用流程进行分析. 主要数据结构(buf0buf.h) Buf_pool Bu ...
随机推荐
- notepad++64位添加plugin manager
- 64位的notepad++,下载下来似乎没有plugin manager,如果真没有可以下载plugin manager. - plugin manager的下载地址:https://github ...
- Websphere MQ Cluster
大纲: 1.什么是集群 2.建立一个基本的集群 3.DISPLAY命令 4.负载均衡 5.高级配置和管理 6.答疑 7.关于文章.红宝书等 一. 什么是集群 集群就是Websphere M ...
- mysql caching_sha2_password异常分析
使用navicat连接mysql报错 解决办法: 通过命令行登录mysql后,输入: alter user 'root'@'localhost' IDENTIFIED WITH mysql_nativ ...
- Vue.js——component(组件)
概念: 组件(Component)是自定义元素. 作用: 可以扩展HTML元素,封装可重用的代码. <div id="myView"> <!-- 把学生的数据循环 ...
- 005_awk案例实战
一.工作经验总结. (1)日志案例: 10.100.194.39 10.100.194.39 1019-03-16T11:01:04+08:00 www.uuwatch.com^^3FF91DE01B ...
- Android 项目中文件夹作用(res文件夹详细介绍)
1. src:存放所有的*.Java源程序. 2. gen:为ADT插件自动生成的代码文件保存路径,里面的R.java将保存所有的资源ID. 3. assets:可以存放项目一些较大的资源文件,例如: ...
- VeeValidate配置中文的两种方法
使用VeeValidate时遇到的问题,下面是我找到的一些解决办法: VeeValidate一直报错早不到addlocale方法 解决办法:1.卸载掉当前版本,重新安装低版本如2.0.0-rc.25 ...
- webpack中require和import的区别
commonjs同步语法 经典的commonjs同步语法如下: var a = require('./a'); a.show(); 此时webpack会将a.js打包进引用它的文件中.这是最普遍的情形 ...
- 完全背包记录路径poj1787 好题
这题有点多重背包的感觉,但还是用完全背包解决,dp[j]表示凑到j元钱时的最大硬币数,pre[j]是前驱,used[j]是凑到j时第i种硬币的用量 △回溯答案时i-pre[i]就是硬币价值 #incl ...
- VS Code 折腾记 - (6) 基本配置/快捷键定义/代码片段的录入(snippet)
前言 本来分成三篇来写的,但是想了想没必要,大家都是聪明人...简单的东西点一下就晓得了. 基本配置 快捷键自定义(Ctrl+K Ctrl + S) 那个when支持条件表达式返回一个布尔值 支持的快 ...