在Android中使用自定义webview的时候,会重写shouldOverrideUrlLoading方法,如下:
public class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
// 父类默认返回false
return super.shouldOverrideUrlLoading(view,url);
}
}
下面就详细了解该方法的作用和使用。先看一下接口源码的注释和翻译:
@Deprecated
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return shouldOverrideUrlLoading(view, request.getUrl().toString());
}
总结一下就是:
- 该方法会在webview加载一个url之前,拦截请求;
- 如果未使用自定义的WebViewClient,系统会要求Activity Manager去处理当前URL,通常使用系统浏览器加载;
- 如果使用了自定义的WebViewClient,返回true表示当前webview中止加载url(效果就像比如点击一个a标签链接没反应),返回false表示webview正常继续加载url;
- 不要调用loadUrl方法并且返回true,就像下面代码一样是错误的:
public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
view.loadUrl(url);
return true;
}
想让当前webview加载通过,正确写法就是返回false:
public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
return false;
}
触发时机
shouldOverrideUrlLoading的介绍和作用了解之后,那么什么时候该方法会被调用。
测试了一下,会被调用的时候有:
1、在页面上使用a标签跳转一个链接时,包括远程连接和本地连接:
远程链接 Assets链接 跳转内存卡下Html 打电话
2、使用form表单,跳转action时,get方法和post方法都会触发:
这篇文章从源码角度分析了该方法触发时机:
- WebView的前进、后退、刷新、以及post请求都不会调用shouldOverrideUrlLoading方法;
- 除去以上行为,还得满足( ! isLoadUrl || isRedirect) 即 (不是通过webView.loadUrl来加载的 或者 是重定向) 这个条件,才会调用shouldOverrideUrlLoading方法。
1、拦截要跳转的URL,判断是使用当前webview打开还是使用浏览器打开
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url != null && url.startsWith("geo")) { // 添加url判断
Intent intent = new Intent(Intent.ACTION_VIEW, Uri
.parse(url));
mContext.startActivity(intent);
return true;
}
return false;
}
2、安全校验,可以设置黑白名单判断是否允许该链接被打开
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url != null && !url.startsWith("geo")) { // 添加url判断
return true;
}
return false;
}
3、电话或者邮件拦截
打电话
调用打电话功能:
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url != null && url.startsWith("tel:")) { // 添加url判断
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse(url);
intent.setData(data);
mContext.startActivity(intent);
return true;
}
return false;
}
4、判断是否是重定向URL
public boolean shouldOverrideUrlLoading(WebView view, String url) {
isRedirect = true;
return false;
}



