热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Cordova原理二

在上一篇文章中(http:www.cnblogs.comStephenWup6580362.html),和大家分享了从TS到cordovapluginnative代

在上一篇文章中(http://www.cnblogs.com/StephenWu/p/6580362.html),和大家分享了从TS到cordova plugin native代码的详细过程。

这篇我们要详细的介绍下cordovaLib的工作原理。首先 我们看下到了cordova plugin的native后,CordovaLib是如何把插件的native集成到项目中去的。

 

 

如果支持@JavescriptInterface,那么我们通过SystemWebview来调用ExposedJsApi里的exec方法,在SystemExposedJsApi中调用CordovaBridge的jsExec方法。

CordovaBridge功能:

PluginManager对象:用于管理当前应用的所有的plugin对象

NativeToJsMessageQueue对象:native 到 Js的通信方式,发送给js的消息队列。

如果不支持@JavescriptInterface,那么直接调用CordovaBridge里的promptOnJsPrompt方法,通过解析是否有”gap:“,如果有的话从传过来的字符串中第四个字符开始解析成具体的参数,然后调用jsExec方法。

CordovaBridge里会通过参数service(字符串,plugin的name),PluginManage会从插件列表中找到具体的CordovaPlugin对象,执行相应的exec方法。所以在android里一个插件的所有方法都只会调用到插件的exec一个方法中,所以这就导致我们在写插件的时候,如果这个插件对外暴露的接口比较多,我们就要在这个方法里写很多的if else或是用switch语句来区分每个调用。

2.插件执行完后,需要把结果返回给ts的调用端。具体流程是:

返回结果是通过CallBackContext来完成封装的,CallBackContext的数据结构如下:

    private String callbackId; // 在js端生成,保存在native端
    private CordovaWebView webView; //webview对象
    protected boolean finished; //这个callback是否结束,如果结束在js端(cordova.js)就会把这个callbackid从列表中删掉,否则这个callback将一直存在,也就是说明你可以用这个callbackContext一直和js保持通信

而返回的数据结构是同PluginResult来封装的。

    private final int status; //状态码
    private final int messageType; //数据类型,比如是json,string还是其他的
    private boolean keepCallback = false; //和CallbackContent里的finished一样的意思
    private String strMessage; //消息
    private String encodedMessage; //js消息
    private List multipartMessages;

encodedMessage最后的形式为:

cordova.callbackFromNative(‘TestPlugin1826548897’,true,1,[{“pmValue”:119,“tvocValue”:357}],true);

这样的消息体.最后通过 evaluateJavascript 或是 loadUrl和JS交互

所有从native到js的消息都会在CordovaBridge里把它放在NativeToJsMessageQueue.最后通过BridgeMode来和js通信。BridgeMode是在一开始的时候设定,有三种mode:

LoadUrlBridgeMode : 这种是通过webView.loadUrl("Javascript:")来执行对应的js代码

OnlineEventsBridgeMode:这种是通过网络变化来和js进行通信

EvalsBridgeMode: 通过 webView.evaluateJavascript执行对应的js代码

 


 OK,到了这里,相信你应该比较清楚这个交互流程了。 


推荐阅读
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 本文介绍了如何在 ASP.NET 中设置 Excel 单元格格式为文本,获取多个单元格区域并作为表头,以及进行单元格合并、赋值、格式设置等操作。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • com.hazelcast.config.MapConfig.isStatisticsEnabled()方法的使用及代码示例 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 实验九:使用SharedPreferences存储简单数据
    本实验旨在帮助学生理解和掌握使用SharedPreferences存储和读取简单数据的方法,包括程序参数和用户选项。 ... [详细]
  • 使用Jsoup解析并遍历HTML文档时,该库能够高效地生成一个清晰、规范的解析树,即使源HTML文档存在格式问题。Jsoup具备强大的容错能力,能够处理多种异常情况,如未闭合的标签等,确保解析结果的准确性和完整性。 ... [详细]
  • 在C#编程中,设计流畅的用户界面是一项重要的任务。本文分享了实现Fluent界面设计的技巧与方法,特别是通过编写领域特定语言(DSL)来简化字符串操作。我们探讨了如何在不使用`+`符号的情况下,通过方法链式调用来组合字符串,从而提高代码的可读性和维护性。文章还介绍了如何利用静态方法和扩展方法来实现这一目标,并提供了一些实用的示例代码。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 深入解析Java虚拟机的内存分区与管理机制
    Java虚拟机的内存分区与管理机制复杂且精细。其中,某些内存区域在虚拟机启动时即创建并持续存在,而另一些则随用户线程的生命周期动态创建和销毁。例如,每个线程都拥有一个独立的程序计数器,确保线程切换后能够准确恢复到之前的执行位置。这种设计不仅提高了多线程环境下的执行效率,还增强了系统的稳定性和可靠性。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 在 Java 中,`join()` 方法用于使当前线程暂停,直到指定的线程执行完毕后再继续执行。此外,`join(long millis)` 方法允许当前线程在指定的毫秒数后继续执行。 ... [详细]
author-avatar
手机用户2502869883
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有