栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

webview中shouldOverrideUrlLoading方法解析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

webview中shouldOverrideUrlLoading方法解析

方法介绍

在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方法都会触发:

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;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/936850.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号