Android中JSBridge的原理和实现
Java如何调用JavaScript?
通过Webview的loadUrl实现,格式为
1 | WebView.loadUrl("javascript:function()"); |
JavaScript如何调用Java?
在JavaScript中,当调用window对象的prompt方法时,会触发Java中的WebChromeClient对象的onJsPrompt方法,可以利用这个机制来实现js调用native的代码。
通信的数据格式是什么样的?
1 | jsbridge://className:port/methodName?jsonObj |
当js调用native的某个方法时,需要className类名,port值是当native需要将操作结果返回给js时,在js中定义的一个callback,并且将这个callback存储在指定的位置上,这个port就是定义了callback的存储位置。
JSBridge的流程是什么样的?
H5->通过某种方式触发一个url->Native捕获到url,进行分析->原生做处理->Native调用H5的JSBridge对象传递回调
JSBridge使用过程中的兼容性问题?
- 字符串转义抛出异常,在jsbridge传递数据的时候,必须以json形式传递,不能直接传递string,bool等基础类型,这样才能应用固定的转义规则。
- Javascript调用原生方法会偶现失败。失败的时机是在webView调用onPageFinished前后。解决方式如下:1) js自己刷新两次 2)先调用一个空方法,然后settimeout 20ms来进行主要业务的调用,避开onPageFinished时间点。
- webview要执行js代码必须在主线程,如果在子线程会出现js收不到native的传值。