Android WebView 内处理302重定向

本文介绍了一个用于处理Android WebView中302重定向问题的方法。通过维护一个URL栈并过滤掉重定向URL,确保了WebView在返回操作时不会重复加载相同的页面。文章详细展示了如何实现这一功能,并提供了一个具体的代码示例。

感谢这篇博文帮我解决了问题:http://qbeenslee.com/article/android-webview-302-redirect/

核心思想:通过记录访问历史url,在返回时候对url进行过滤出来。

public class NewsDetailActivity extends AppCompatActivity{
    private WebViewWithProgress myWebViewWithProgress;
    private WebView myWebView;
    private String newsDetailURL;

    /**
     * 记录URL的栈
     * 规则:
     * 1.不可在{@code WebView.onPageFinished();}中开始记录URL
     * 2.记录需要屏蔽重定向URL
     * */
    private final Stack<String> mUrls=new Stack<>();
    /**
     * 判断页面是否加载完成
     * */
    private boolean mIsloading=false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_news_detail);

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //透明状态栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //透明导航栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }

        Toolbar toolbar = (Toolbar) findViewById(R.id.detail_toolbar);
        setSupportActionBar(toolbar);
        // Show the Up button in the action bar.
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
        }

        // 查找浏览器控件ID
        myWebViewWithProgress = (WebViewWithProgress) findViewById(R.id.MyWebViewContent);

        //获取浏览器
        myWebView = myWebViewWithProgress.getWebView();

        // 设置页面支持JavaScript
        myWebView.getSettings().setJavaScriptEnabled(true);

        //缩放开关
        //设置此属性,仅支持双击缩放,不支持触摸缩放(android4.0)
        myWebView.getSettings().setSupportZoom(true);
        // 设置是否可缩放
        myWebView.getSettings().setBuiltInZoomControls(true);
        //将图片调整到适合WebView的大小
        myWebView.getSettings().setUseWideViewPort(true);
        myWebView.getSettings().setDomStorageEnabled(true);
        myWebView.getSettings().setUseWideViewPort(true);

        myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        //设置图片自动加载
        myWebView.getSettings().setLoadsImagesAutomatically(true);

        newsDetailURL = getIntent().getStringExtra("newsDetailURL");


        // 设置WebView监听事件
        myWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                // TODO Auto-generated method stub
                return false;
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                if(mIsloading &&mUrls.size()>0)
                {
                    mUrls.pop();
                }
                recordUrl(url);
                super.onPageStarted(view, url, favicon);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                Log.v("FairyDebug", "URL加载完毕" + url);
                super.onPageFinished(view, url);
                if(mIsloading|| url.startsWith("about:"))
                {
                    mIsloading=false;
                }
            }


        });

        Log.v("FairyDebug","--------get---------------"+newsDetailURL);
        // 加载URL
        myWebView.loadUrl(newsDetailURL);


    }
    /**
     * 记录非重定向链接 避免刷新页面造成的重复入栈*/
    private void recordUrl(String url)
    {
        //这里还可以根据自身业务来屏蔽一些链接放入URL栈
        if(!TextUtils.isEmpty(url)&& !url.equalsIgnoreCase(getLastPageUrl())){
            mUrls.push(url);
        }
    }

    /**获取上一页的链接*/
    private synchronized  String getLastPageUrl(){
        return mUrls.size()>0 ? mUrls.peek():null;
    }

    /**推出上一页链接*/
    public String popLastPageUrl(){
        if(mUrls.size()>=2)
        {
            mUrls.pop();// pop current page url
            return mUrls.pop();
        }
        return  null;
    }

}
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126

后话:

若没有设置 WebViewClient 则在点击链接之后由系统处理该 url,通常是使用浏览器打开或弹出浏览器选择对话框。
若设置 WebViewClient 且该方法返回 true ,则说明由应用的代码处理该 url,WebView 不处理。
若设置 WebViewClient 且该方法返回 false,则说明由 WebView 处理该 url,即用 WebView 加载该 url。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值