为了匹配iOS WebviewJavascriptBridge(https://github.com/marcuswestin/WebViewJavascriptBridge)的方法调用,我为register_handle和call_handle的调用做了一些代理。请注意,我不是 Javascript 专家,因此可能有更好的解决方案。
javascriptBridge = (function() {
var handlers = {};
return {
init: function () {
},
getHandlers : function() {
return handlers;
},
callHandler : function(name, param) {
if(param !== null && param !== undefined) {
JSInterface[name](param);
} else {
JSInterface[name]();
}
},
registerHandler : function(name, method) {
if(handlers === undefined) {
handlers = {};
}
if(handlers[name] === undefined) {
handlers[name] = method;
}
}
};
}());
通过这种方式,您可以从 Javascript 发送可以具有字符串参数的 Java 调用
javascriptBridge.callHandler("login", JSON.stringify(jsonObj));
调用
@JavascriptInterface
public void login(String credentialsJSON)
{
Log.d(getClass().getName(), "Login: " + credentialsJSON);
new Thread(new Runnable() {
public void run() {
Gson gson = new Gson();
LoginObject credentials = gson.fromJson(credentialsJSON, LoginObject.class);
SingletonBus.INSTANCE.getBus().post(new Events.Login.LoginEvent(credentials));
}
}).start();
}
你可以用
回调Javascript
javascriptBridge.registerHandler('successfullAuthentication', function () {
alert('hello');
})
和
private Handler webViewHandler = new Handler(Looper.myLooper());
webViewHandler.post(
new Runnable()
{
public void run()
{
webView.loadUrl("javascript: javascriptBridge.getHandlers().successfullAuthentication();"
}
}
);
如果需要传递参数,序列化为JSON字符串然后调用StringEscapeUtils.escapeEcmaScript(json),否则会得到unexpected identifier: source (1)错误。
有点俗气和hacky,但它有效。您只需删除以下内容。
connectWebViewJavascriptBridge(function(bridge) {
}
编辑:
为了把全局变量改成实际的属性,我把上面的代码改成如下:
(function(root) {
root.bridge = (function() {
var handlers = {};
return {
init: function () {
},
getHandlers : function() {
return handlers;
},
callHandler : function(name, param) {
if(param !== null && param !== undefined) {
Android[name](param);
} else {
Android[name]();
}
},
registerHandler : function(name, method) {
if(handlers === undefined) {
handlers = {};
}
if(handlers[name] === undefined) {
handlers[name] = method;
}
}
};
}());
})(this);
我的想法来自Javascript global module or global variable。