Android中JSBridge的原理和实现

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的流程是什么样的?

JSBridge流程图

H5->通过某种方式触发一个url->Native捕获到url,进行分析->原生做处理->Native调用H5的JSBridge对象传递回调

h5与原生页面交互流程

JSBridge使用过程中的兼容性问题?

  1. 字符串转义抛出异常,在jsbridge传递数据的时候,必须以json形式传递,不能直接传递string,bool等基础类型,这样才能应用固定的转义规则。
  2. Javascript调用原生方法会偶现失败。失败的时机是在webView调用onPageFinished前后。解决方式如下:1) js自己刷新两次 2)先调用一个空方法,然后settimeout 20ms来进行主要业务的调用,避开onPageFinished时间点。
  3. webview要执行js代码必须在主线程,如果在子线程会出现js收不到native的传值。