在Android開(kāi)發(fā)過(guò)程中,使用過(guò)WebView的童鞋可能難免會(huì)遇到URL重定向問(wèn)題拗小。
簡(jiǎn)單敘述下這種問(wèn)題的情況银还,就是WebView首先加載A鏈接,然后在WebView上點(diǎn)擊一個(gè)B鏈接進(jìn)行加載腐碱,B鏈接會(huì)自動(dòng)跳轉(zhuǎn)到C鏈接誊垢,這個(gè)時(shí)候調(diào)用WebView的goback方法掉弛,會(huì)返回到加載B鏈接,但是B鏈接又會(huì)跳轉(zhuǎn)到C鏈接喂走,從而導(dǎo)致沒(méi)法返回到A鏈接界面(當(dāng)然也有朋友說(shuō)快速的按兩次返回鍵-也就是連續(xù)觸發(fā)了兩次goback可以返回到A鏈接殃饿,但并不是所有用戶都懂這個(gè),而且操作上也很惡心芋肠。)乎芳,這就是重定向問(wèn)題。
這個(gè)問(wèn)題由來(lái)已久帖池,網(wǎng)上解決辦法也有好幾種奈惑,但是都沒(méi)有什么很好的統(tǒng)一的解決方式,QQ微信之類的內(nèi)置瀏覽器做的很好睡汹,不過(guò)不知道其實(shí)現(xiàn)方式肴甸。
以往的解決思路就是包括自己維護(hù)webview的url歷史棧,或者前后端勾兌好囚巴,或者依賴服務(wù)器之類的什么沒(méi)試過(guò)的xx方式原在,見(jiàn)鏈接:
http://blog.csdn.net/t12x3456/article/details/39134961
內(nèi)容就各位慢慢去體會(huì),也是一種思考的過(guò)程彤叉,其實(shí)這些解決辦法在以往也是非常有用的庶柿,其實(shí)這個(gè)解決辦法跟工程設(shè)置的編譯版本和最小版本有關(guān),大家都知道姆坚,在不同的版本上澳泵,程序有很多不同的效果和處理方式。今天我關(guān)注的不是在上面兼呵,而是接下來(lái)要說(shuō)的4.0以后的解決重定向的方法兔辅,非常簡(jiǎn)單(我是基于4.0做得測(cè)試,到底這個(gè)方法支持到什么版本击喂,我未研究)维苔。
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
一言不合就貼了代碼,對(duì)的懂昂,就是這么簡(jiǎn)單介时,就是直接返回false,就可以解決重定向問(wèn)題凌彬。
網(wǎng)上搜索了下這里返回false和返回true的原因沸柔,其實(shí)我也看的云里霧里,沒(méi)理解透徹
shouldOverrideUrlLoading :這個(gè)方法的返回值
return true 表示當(dāng)前url即使是重定向url也不會(huì)再執(zhí)行(除了在return true之前使用webview.loadUrl(url)除外铲敛,因?yàn)檫@個(gè)會(huì)重新加載)
return false? 表示由系統(tǒng)執(zhí)行url褐澎,直到不再執(zhí)行此方法,即加載完重定向的ur(即具體的url伐蒋,不再有重定向)工三。
先弄出來(lái)迁酸,大家可以交流,看看對(duì)不同的api的效果是什么樣子俭正。
附帶在一個(gè)論壇上看到一個(gè)網(wǎng)友的解釋奸鬓,我覺(jué)得也很有參考的價(jià)值,其實(shí)跟自己維護(hù)歷史棧道理相同掸读,不過(guò)它是通過(guò)httpcode來(lái)判斷是否是重定向地址串远,以下是他說(shuō)的:
來(lái)講講WebView加載重定向頁(yè)面會(huì)遇到問(wèn)題。
1.如果需要獲取webview訪問(wèn)的url地址寺枉,那么加載重定向頁(yè)面時(shí)會(huì)顯示兩次
2.如果WebView在加載頁(yè)面的過(guò)程中抑淫,有加載重定向頁(yè)面,那么在Android2.3版本中會(huì)遇到無(wú)法回退的問(wèn)題姥闪,但是4.0以上系統(tǒng)不會(huì)。例如砌烁,用戶在點(diǎn)擊回退時(shí)筐喳,webview會(huì)執(zhí)行g(shù)oBack()方法,2.3系統(tǒng)不能正澈恚回退避归,而4.0能正常回退管呵,可以解釋為4.0系統(tǒng)的webview對(duì)重定向做了處理梳毙,他會(huì)把重定向的兩個(gè)頁(yè)面看做是一個(gè)頁(yè)面,所以webview成功回退了捐下,但是2.3系統(tǒng)的webview會(huì)先回退到重定向頁(yè)面(非真正的目的頁(yè)面)账锹,回退之后會(huì)執(zhí)行l(wèi)oadUrl(url)方法,而這是因?yàn)閡rl是個(gè)重定向url坷襟,所以會(huì)跳轉(zhuǎn)到真正的目標(biāo)頁(yè)面奸柬,so,經(jīng)過(guò)兩次加載婴程,頁(yè)面還是回到goBack()之前的頁(yè)面廓奕!
問(wèn)題2的解決方案:
從重定向的概念可知,當(dāng)訪問(wèn)重定向url時(shí)服務(wù)器會(huì)返回301狀態(tài)碼档叔,那么可以根據(jù)此特殊的狀態(tài)碼來(lái)把重定向頁(yè)面排除在歷史訪問(wèn)記錄隊(duì)列里桌粉。
具體思路為:
(1)自定義一個(gè)歷史url訪問(wèn)隊(duì)列——MyWebBackForwardList
(2)在webview每次loadUrl(url)之前先用HttpUrlConnection對(duì)象的getResponseCode()方法來(lái)獲取狀態(tài)碼,如果==301衙四,不加入隊(duì)列中铃肯,否者加入。
(3)重寫webview的canGoBack()和goBack()方法
不再使用webview的WebBackForwardList對(duì)象來(lái)取歷史url届搁,而是使用自定義的MyWebBackForwardList來(lái)取出回退的url