android:拦截超链接,重定向问题,以及重定向后的返回问题。

在用手机浏览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张图

           

扫描二维码关注公众号,回复: 12163417 查看本文章

然后我看网上有些写法是这样的,在重定向里面写 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;
                }

猜你喜欢

转载自blog.csdn.net/qq_27454233/article/details/112377030