Cordova-Android的初始化过程
-
Android通过
webView.addJavascriptInterface
的方式向webview
端暴露了_cordovaNative
的对象,其有三个方法:-
exec
:用来执行调用Android的方法js调用Android的方法主要以此方法来进行 -
setNativeToJsBridgeMode
:切换JsBridge的模式(CB-2666
js方法通过exec
方法向Android传递数据,可能Android无法收到并解析参数,此时就需要通知js来切换BridgeMode
了) -
retrieveJsMessages
:js端主动取回待消息队列中的消息
-
-
在
cordova.js
文件加载完毕时将通过require('cordova/init')
调用platform.bootstrap()
,经过一系列的中间方法最终将调用androidExec.init()
方法:androidExec.init = function() { bridgeSecret = +prompt('', 'gap_init:' + nativeToJsBridgeMode); channel.onNativeReady.fire(); };
此方法将调用js的prompt
并设置固定格式的数据gap_init:3
,3
即nativeToJsModes.EVAL_BRIDGE
- Android通过
webChromeClient.onJsPrompt
拦截prompt
即能拿到js端所传递过来的数据:3
以及js网页对应host
,并判断js端对应的host
是否在白名单内,若在白名单内则根据3
将jsMessageQueue
的BridgeMode
设置为3
即EvalBridgeMode
,并返回一个随机数字作为双方协商的秘钥,若host
不在白名单内,则返回的是一个空白字符串""
,下次js端调用exec方法时通过对secret
的比对即可知道该网页对应的host
是不在Android运行的白名单内。
prompt
是同步方法,js会一直等到native返回消息了之后才会继续执行 - js拿到了
secret
之后即知道Android已经初始化完毕,并且设置好了BridgeMode
准备好了接受数据了,此时js端会:-
onNativeReady
事件开始派发 -
订阅
onCordovaReady
-
pluginloader
可以开始加载插件(异步执行),加载好插件之后将派发onPluginsReady
- 在
onPluginsReady
并且onNativeReady
之后onCordovaReady
事件开始派发 - 订阅到
onCordovaReady
事件,开始使用exec
方法向CoreAndroid
插件请求执行messageChannel
以及show
方法。-
messageChannel
提供了一个Android某些生命周期与实体按钮点击时Android与js的通道,当Androidresume
或pause
时事件将通过messageChannel
对应的callbackId
进行传递 -
show
方法将隐藏Spinner
并将webview
展示出来
-
- 在
onCordovaReady
以及onDOMContentLoaded
完毕之后通知cordova
派发deviceready
事件,js与Android间通道正式打通
-
至此Cordova Android已经初始化完毕了