JS 调用 java 方法
WebView 允许开发者拓展 JavaScript API 命名空间,通过 Java 定义各自的组件然后令其在 JavaScript 环境中可用。例如:
1 | webView = (IgmWebView) findViewById(R.id.webview); |
其中 BridgeApi
中核心代码如下:
1 |
|
pluginMgr
对象的 invoke
方法中,通过原生的方式解析 jsBridge
JSON 中的类名、方法名,然后反射调用:
1 | public String invoke(String jsBridge) { |
其中通过注解,限制了可以被 js 调用的 java 方法;entries 中维护了实现 IPlugin 接口的类对象单例。
js 中若想调用,只需要:
1 | var params = { |
回调实现返回值处理
上面的问题是,调用 java 方法后,不能直接得到返回值。
一个思路就是通过给每次调用标记一个 callbackId ,并把需要的回调方法与这个 id 放在 map 中,当 java 执行结束时,便可以通过 callbackId 找到等待的回调方法,并调用需要的 SUCCESS
或 ERROR
回调即可:
1 | api.invokeV4 = function(plugin, method, param, success, error) { |
java 中调用 js 方法需要通过 webview
的 loadUrl
方法,例如:
1 | class UIRunnable implements Runnable { |
然后在核心 WebView 的方法中通过 runOnUiThread
运行,即可执行该 js:
1 | public void postLoadUrl(String url) { |