【android】shouldoverrideurlloading 和 shouldinterceptrequest 之间的区别?

Android WebKit实现允许开发人员通过 android.webkit.WebSettings类修改 WebView

支持JavaScript,
支持插件,
文件系统访问,
资源检查等

在资源检查中,可以通过覆盖shouldOverrideUrlLoadingshouldInterceptRequest方法来检查对内容和/或资源的请求。

但上述两种方法用于不同的目的,例如

1.当新页面即将被打开时调用shouldOverrideUrlLoading,而每次资源被加载的时候都会调用shouldInterceptRequest,如css文件,js文件等。

2.如果用户从WebView内交互地请求资源,可以通过使用WebViewClient类的shouldOverrideUrlLoading方法来截取请求。示例代码如下所示。 Source

private class MyWebViewClient extends WebViewClient {
     @Override public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (Uri.parse(url).getHost().equals("www.google.com")) {
            return true;
        }
        return false;
    }
 }

该方法使主机应用程序有机会在当前WebView中加载新的URL时接管控件。返回值为true表示主机应用程序处理URL,而返回false表示当前WebView处理URL。以上代码阻止资源从主机“www.google.com”加载。

但是,该方法不会阻止来自内部的资源加载,例如来自htmlscript标签中的iframesrc属性。另外XmlHttpRequests也不会被拦截。为了拦截这些请求,您可以使用WebViewClientShouldInterceptRequest方法。示例代码如下所示。

@Override
public WebResourceResponse shouldInterceptRequest(final WebView view, String url) {
    if (url.contains(".js")) {
        return getWebResourceResponseFromString();
    } else {
        return super.shouldInterceptRequest(view, url);
    }
}
private WebResourceResponse getWebResourceResponseFromString() {
    return getUtf8EncodedWebResourceResponse(new StringBufferInputStream("alert('!NO!')"));
}
private WebResourceResponse getUtf8EncodedWebResourceResponse(InputStream data) {
    return new WebResourceResponse("text/css", "UTF-8", data);
}

该方法通知主机应用程序资源请求,并允许应用程序返回数据。如果返回值为null,则WebView会照常继续加载资源。否则,将使用返回响应和数据。上面的代码拦截了JavaScript资源(.js)的请求,并返回一个警报,而不是请求的资源。

请参阅:WebViewClient shouldOverrideUrlLoadingshouldInterceptRequest

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值