前言:前段时间在和一个朋友沟通的时候说到了webview的java与js的交互,他的项目的实现方式是通过拦截网页地址也就是覆盖shouldOverrideUrlLoading方法的形式,而我是一直使用的是添加js接口也就是addJavascriptInterface的形式实现的,这时候突然想起来虽然一直在项目中使用webview,但是还没有好好写过webview使用的博客进行总结,所以有了今天的这篇文章。
概括:这篇文章内容主要是讲的我各种中遇见的关于webview使用的所有的情况和配置用法,有webview的基本配置,webview的安全的配置,webview里面java和js的交互 等等 各种技术的实现和示例。
好了,这就开始正文了。。
一:webview里面js与java的交互。
1.自定义重写WebViewClient类,用覆盖shouldOverrideUrlLoading方法的方式来实现。
public class ZhikeWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (isHttpUrl(url)){//如果是网页地址就直接加载网页
ZhikeWebView webView = (ZhikeWebView) view;
webView.loadUrl(url);
return false;
}
//如果不是网页地址,就代表是前端和后台商量好的协议,可以在这里做拦截进行处理
return true;
}
private boolean isHttpUrl(String url){
return url.startsWith("http://") || url.startsWith("https://");
}
}
在web中调用方式:
<button οnclick="window.open('www.example.com?body=loadurl')">showAndroidToast</button>
2.自定义重写WebChromeClient类,使用使用onJsAlert或者onJsPrompt的形式实现。
class MyWebChromeClient extends WebChromeClient {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Log.d("MyWebChromeClient", message);
Toast.makeText(OnJsPromptActivity.this, message, Toast.LENGTH_SHORT).show();
result.confirm();
return true;
}
@Override
public boolean onJsConfirm(WebView view, String url, String message,
JsResult result) {
return super.onJsConfirm(view, url, message, result);
}
@Override
public boolean onJsPrompt(WebView view, String url, String message,
String defaultValue, JsPromptResult result) {
Toast.makeText(OnJsPromptActivity.this, message, Toast.LENGTH_SHORT).show();
//return super.onJsPrompt(view, url, message, defaultValue, result);
result.confirm();
return true;
}
}
请注意:在这里,nJsAlert,onJsPrompt分别对应JS中的alert和prompt。
在web中调用方式:
<button οnclick="showAndroidToast('Hello Android!');">showAndroidToast</button>
<script type="text/javascript">
function showAndroidToast(toast) {
prompt('js prompt');
}