Cordova原理一
我们知道cordova中js要和native通信都是通过 cordova plugin来实现的。如果我们自己创建一个cordova plugin,它其实就是几个独立的文件按照一定的目录结构放在一起,然后用户自己去手动配置plugin.xml文件(这个文件也要放在plugin中),之后我们利用cordova plugin add 命令来安装一个plugin到对应的工程中(plugin的安装和使用会有专门的文章来阐述)。安装后的plugin如何和现在工程融合的呢?这就是我们这里要详细阐述的。
1. 调用插件的流程(ionic2是用TypeScript来实现js的)

ts先利用cordova plugin里提供的接口,调用插件的js代码,这就是流程一。在流程二里是插件js调用插件的native代码。在流程三中,插件native接收到插件js发过来的请求(方法调用),插件native实现相应的功能后,把相应结果返回给ts。如果仅仅是这张图,其实我们在整个过程都看不到cordova到底干了什么事情。为了让大家更明白cordova的作用,我们在上述的流程图里加入了cordova的部分。

这张图很像我前面分享的mvp架构图(http://www.cnblogs.com/StephenWu/p/5680053.html)。可以看到,我们上面的三个流程中都有cordova的身影,而且在整个流程中占有重要的地位。如果没有cordova,也许这些流程里需要我们自己写N多代码才能保证一个完整的通信过程。我们将详细的阐述每个流程中cordova是怎么样实现的
2.流程一:ts到插件js

在ts里我们调用插件的方式是:cordova.plugins.TestPlugin.coolMethod,其中在TestPlugin.js里有coolMethod这个方法。
那这个调研是如何实现的呢?
首先我们看下 ionic2项目有cordova_plugin.js文件,该文件是当前工程里所有安装的plugin。格式如下:
{
"id": "cordova-plugin-splashscreen.SplashScreen",
"file": "plugins/cordova-plugin-splashscreen/www/splashscreen.js",
"pluginId": "cordova-plugin-splashscreen",
"clobbers": [
"navigator.splashscreen"
]
}
对照上面我画的流程图,在build的时候通过handlePluginsObject 方法 把 cordova_plugin.js里的所有的plugin都加载进入 symbolList 当Native代码加载完成后,会调用channel.join去创建所有的cordova对象,包括插件对象插件对象的创建:通过exports.mapModules,调用cordova/builder 里的assignOrWrapInDeprecateGetter ,再调用 clobber 方法,最后调用cordova/utils里的 defineGetter里方法,实现 通过调用 cordova_plugin.js里的
"clobbers": [
"cordova.plugins.TestPlugin"
]
定义的名字可以调用到对应的方法。这样ts和js的通道就打通了。
那么接下里的问题是,plugin的js是如何调用到plugin的native代码的呢?接着看下面的流程图:
刚才上面知道ts中调用:cordova.plugins.TestPlugin.coolMethod到plugin 的TestPlugin.js的详细流程。那么接下来:
调用了cordova.plugins.TestPlugin.coolMethod后,cordova.js会调用androidExec方法(不同平台都有一份cordova.js,比如iOS的就调用platforms/ios下的corodova.js里iOSExec方法)。在androidExec里会根据一定规则(pluginname + 可变得数(每次都加1))为每个调用生成一个callbackId,这个id是唯一,用于唯一标识一次调用,在native返回到js时候需要用到这个来确认这个回调是属于哪个方法的。在androidExec方法中会调用nativeApiProvider.get().exec方法。nativeApiProvider是初始化为:
解释为:_cordovaNative 是指 在webview里设置了webView.addJavascriptInterface(exposedJsApi, "_cordovaNative"),执行nativeApiProvider.get().exec方法后就会执行exposedJsApi.java里的相应方法; 如果没有设置,那么就调用 platform_www/cordova-js-src/android/promptbasednativeapi.js里exec方法,该方法是执行 js的prompt方法(这个是一个常用的jsbridge里通信方法),之后就会执行WebChromClient的onJsPrompt方法。
到这里,我们已经知道了cordova是怎么从ts到插件的native代码的。
下面将介绍的是cordovalib的工作原理
Cordova原理一的更多相关文章
- cordova原理与插件制作
---恢复内容开始--- cordova插件打包教程: http://www.jianshu.com/p/96855e009e95 www.itnose.net/detail/6245407.html ...
- cordova与ios native code交互的原理
非常早曾经写了一篇博客,总结cordova插件怎么调用到原生代码:cordova调用过程,只是写得太水.基本没有提到原理.近期加深了一点理解,又一次补充说明一下 js调用native 以下是我们产品中 ...
- Cordova 浅析架构的原理
因为项目使用了Cordova,也使用了很长时间.至于有很多hybride框架,为什么我们使用Cordova,这里不做过多的叙述,我们也是根据项目需求来选定的,需要及时更新.还要输出别人SDK等.没有最 ...
- webapp应用---cordova.js 3.7.0插件安装总结
今天是2014年的最后一天,年终总结什么的就不写了.记录一下今天的工作内容.如果不知道phoneGap,那么就不需要往下看了,phoneGap现在已经叫cordova了,叫什么不重要,重要的是它对we ...
- ionic cordova 热更新(引用自www.zyyapp.com/post/116.html)
上篇文章cordova 把html打包成安卓应用 http://www.zyyapp.com/post/115.html cordova 热更新是一个大坑,我看了一天一夜才明白.网上的教程都没说到重点 ...
- Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例
引言 Cordova(PhoneGap)采用的是HTML5+JavaScript混合模式来开发移动手机APP,因此当页面需要获取手机内部某些信息时(例如:联系人信息,坐标定位,短信等),程序就需要调用 ...
- Cordova webapp实战开发:(2)认识一下Cordova
昨天写了第一篇 <Cordova webapp实战开发:(1)为什么选择 Cordova webapp?>,意料中看到大家对这个主题的兴趣,我新建的PhoneGap App开发 34819 ...
- (二)cordova+framework7入门——笑笑APP
[前言] framework7确实做的很赞,但是一直各种原因没有做什么app, 这个感觉就像大厨遇到百年难见的好材料,不炒个菜憋的慌, 机缘巧合周一周二两个晚上做了一个简单app,先看下效果: ios ...
- HTML5 移动应用开发环境搭建及原理分析
开发环境搭建: 一.Android 开发平台搭建 安装java jdk:\\10.194.151.132\Mewfile\tmp\ADT 配置java jdk 1) 新建系统变量,JAVA_HOME ...
随机推荐
- HDU3652(数位dp)
A - B-number Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descri ...
- Graphql入门
Graphql入门 GraphQL是一个查询语言,由Facebook开发,用于替换RESTful API.服务端可以用任何的语言实现.具体的你可以查看Facebook关于GraphQL的文档和各种语言 ...
- 未来手机Alo即将问世!全息投影手机的新高峰!全息3d 网
文章来源:网络 编辑:大熊 [摘要]全息投影手机很早就开始炒,网络上的概念机也是丛出不穷,那么这款出自法国的概念机又是多么的奇葩?全息 3d 网带你一探究竟. 据外媒报道,在不久将来语 ...
- 02月刊(上) | 微信小程序
* { margin: 0; padding: 0 } .con { width: 802px; margin: 0 auto; text-align: center; position: inher ...
- 使用cordova开发app
前言 公司之前用的app就是一个套壳挂个链接就能用的app,后来需要添加微信分享方便传播,没办法只好做成混合式的app了, 因为之前做.net用vs可以创建cordova项目也试着玩过,就决定用cor ...
- SQL Server-聚焦事务对本地变量、临时表、表变量影响以及日志文件存满时如何收缩(三十一)
前言 接下来我们将SQL Server基础系列还剩下最后几节内容结束,后续再来讲解SQL Server性能调优,我们开始进入主题. SQL Server事务对本地变量影响 事务对变量影响具体是指什么意 ...
- Glusterfs下读写请求的处理流程
Glusterfs基于内核的fuse模块,fuse模块除了创建fuse文件系统外,还提供了一个字符设备(/dev/fuse),通过这个字符设备,Glusterfs可以读取请求,并发送响应,并且可以发送 ...
- hibernate注解的简单应用
注解代替了我们用的*.hbm.xml文件.简少了我们的代码量:应用简单. @Override 用途:重写父类的同名方法 单元测试注解 @Test 用途:用于测试 @Before 用途:单测方法走之前执 ...
- EM and GMM(Code)
In EM and GMM(Theory), I have introduced the theory of em algorithm for gmm. Now lets practice it in ...
- Python 接口测试(三)
四:python接口之http请求 python的强大之处在于提供了很多的标准库以及第三库,本文介绍urllib 和第三库的requests. Urllib 定义了很多函数和类,这些函数和类能够帮助我 ...