在用手机浏览web页面的时候,假如有对应的H5,会自动转到H5页面。这是网页在识别了为移动端时进行了重定向。
比如台风路径网:http://typhoon.zjwater.gov.cn/default.aspx 在使用移动端浏览时,会自动转为http://typhoon.zjwater.gov.cn/wap.htm 使之浏览体验更好。
假如只是简单地使用webView加载url是没有什么影响的,内部会自己处理。
但是假如,你为了实现在H5点击某些超链接,进行跳转的话,你需要拦截超链接:
mWebView.setWebViewClient(new WebViewClient() {
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
return super.shouldInterceptRequest(view, request);
}
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
return super.shouldInterceptRequest(view, url);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, final String url) {
//判断是不是自己需要的地址baseUrl方法里是判断是否是我需要的开头的,这里视具体情况而定
String baseUrl = baseUrl(url);
if (baseUrl != null) {
String[] contents = url.split(baseUrl);
if (contents.length == 2) {
String content = contents[1];
//就比如识别到了某些字段,跳转对应的原生页面
if (content.contains("xxxx")) {
startActivity(XxxxxActivity.intentFor(getActivity(), ""));
return true;
}
}
//这边就是识别到了某些自己需要的链接地址,进行本地跳出一个新窗口跳转
startActivity(SimpleWebActivity.intentFor(getActivity(), url, ""));
return true;
}
//跳转到外部浏览器,为的是某些不知名网址或者下载链接
H5WebUtil.setUserIdCookie(url);
Uri uri = Uri.parse(url);
Intent in = new Intent(Intent.ACTION_VIEW, uri);
startActivity(in);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
loadFinished(view, url);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
loadStarted(view, url, favicon);
}
});
代码应该算比较简单。点击超链接的时候就会进到shouldOverrideUrlLoading,然后return true就不会跳转到浏览器。
这时候对于需要重定向网址会发生这种情况:点击超链接“http://typhoon.zjwater.gov.cn/default.aspx”,触发shouldOverrideUrlLoading,弹出新页面加载,然后网页内部触发重定向,再次触发shouldOverrideUrlLoading,就会造成第二个弹窗。
可以看出,解决这个问题,需要判断此次触发shouldOverrideUrlLoading是否为重定向。
先给出判断是否重定向:
WebView.HitTestResult hitTestResult = view.getHitTestResult();
if (!TextUtils.isEmpty(url) && (hitTestResult == null || hitTestResult.getExtra() == null)) {
//进到这里应该就是重定向了
}
附上2张图
然后我看网上有些写法是这样的,在重定向里面写 view.loadUrl(url),这样会造成一个问题,在使用webView.goBack()时,会返回到被重定向之前的页面,然后又被重定向。因为我在左上角返回键,是可以goBack的时候,先返回上个页面,就会造成无法退出。
那么就想到上面说的,简单使用的话,重定向不会有任何问题,内部自己处理了,因此给它返回false让它走默认方法就行了,shouldOverrideUrlLoading默认就是返回false的
WebView.HitTestResult hitTestResult = view.getHitTestResult();
if (!TextUtils.isEmpty(url) && (hitTestResult == null || hitTestResult.getExtra() == null)) {
return false;
}