Cordova-Android的初始化过程

Cordova-Android的初始化过程

  1. Android通过 webView.addJavascriptInterface的方式向webview端暴露了_cordovaNative的对象,其有三个方法:

    • exec:用来执行调用Android的方法js调用Android的方法主要以此方法来进行
    • setNativeToJsBridgeMode:切换JsBridge的模式(CB-2666js方法通过exec方法向Android传递数据,可能Android无法收到并解析参数,此时就需要通知js来切换BridgeMode了)
    • retrieveJsMessages:js端主动取回待消息队列中的消息
  2. cordova.js文件加载完毕时将通过require('cordova/init')调用platform.bootstrap(),经过一系列的中间方法最终将调用androidExec.init()方法:

      androidExec.init = function() {
          bridgeSecret = +prompt('', 'gap_init:' + nativeToJsBridgeMode);
          channel.onNativeReady.fire();
      };
    

此方法将调用js的prompt并设置固定格式的数据gap_init:33nativeToJsModes.EVAL_BRIDGE

  1. Android通过webChromeClient.onJsPrompt拦截prompt即能拿到js端所传递过来的数据:3以及js网页对应host,并判断js端对应的host是否在白名单内,若在白名单内则根据3jsMessageQueueBridgeMode设置为3EvalBridgeMode,并返回一个随机数字作为双方协商的秘钥,若host不在白名单内,则返回的是一个空白字符串"",下次js端调用exec方法时通过对secret的比对即可知道该网页对应的host是不在Android运行的白名单内。
    prompt是同步方法,js会一直等到native返回消息了之后才会继续执行
  2. js拿到了secret之后即知道Android已经初始化完毕,并且设置好了BridgeMode准备好了接受数据了,此时js端会:
    1. onNativeReady事件开始派发
    2. 订阅onCordovaReady
    3. pluginloader可以开始加载插件(异步执行),加载好插件之后将派发onPluginsReady
    4. onPluginsReady并且onNativeReady之后onCordovaReady事件开始派发
    5. 订阅到onCordovaReady事件,开始使用exec方法向CoreAndroid插件请求执行messageChannel以及show方法。
      • messageChannel提供了一个Android某些生命周期与实体按钮点击时Android与js的通道,当Androidresumepause时事件将通过messageChannel对应的callbackId进行传递
      • show方法将隐藏Spinner并将webview展示出来
    6. onCordovaReady以及onDOMContentLoaded完毕之后通知cordova派发deviceready事件,js与Android间通道正式打通

至此Cordova Android已经初始化完毕了

cordova-android-初始化过程解析.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容