JS调用Android代码:
- Webview.addJavascriptInterface(Object object,String name)
- 通过WebViewClient.shouldOverrideUrlLoading()
- 通过WebChromeClient.onJsAlert()、onJsConfirm()、onJsPrompt()
Android调用JS:
- 通过WebView.loadUrl()
- 通过WebView.evaluateJavascript() 版本>= KITKAT 19
细节:
JS调用Android代码:
1. Webview.addJavascriptInterface(Object object,String name)
这个方法可以向加载网页后的window中添加一个原生的java对象,如下例:
native方面:
Webview.addJavascriptInterface(new Android(),”android”);
class Android{
@JavascriptInterface
public String sayHello(String message){
Log.i(“TAG”,”say hello ” + message);
return “say hello ” + message;
}
}
这样,JavaScript方面就可以调用到原生的方法
<script>
var message = window.android.sayHello(“XXX”);
// message = “say hello XXX”
</scpirt>
window 对象表示浏览器中打开的窗口。window.android 对象是我们刚通过 Webview. addJavascriptInterface 添加的对象。
2.shouldOverrideUrlLoading
这个方法主要是让 Android 的 WebviewClient. shouldOverrideUrlLoading 方法拦截到 url 请求,相当于一个aop操作,前端那边有三种方式可以产生这个事件:
(1)<a href=“http://m.haodf.com/”>Text</a>
(2) window.location.href=“http://m.haodf.com/”
(3)var iframe = document.createElement(‘iframe’);
iframe.style.display=‘none’
iframe.src=http://m.haodf.com;
document.documentElement.appendChild(iframe);
这个可以看做一种JavaScript调用Native的手段。
Android调用JS
首先在Js上有这么一个方法:
<script>
function sayHello(name){
return “say hello ” + name + “ from js.”;
}
</script>
在Native通过如下方式就可以执行Js的方法:
// KITKAT 及以上版本:
String script = “window.sayHello(\”XXX\”);”;
webview.evaluateJavascript(script , new ValueCallback<String>(){
public void onReceiveValue(String value){
Log.i(TAG,value); // value = say hello from js
}
});
// KITKAT 以下版本
webview.loadUrl(“javascript:” + script);
evaluateJavascript 方法是 KITKAT 新增的方法,在执行完 Javascript 方法后,可以收到一个 String 的返回值。
网友评论