android webview 解决回退重定向的问题

本文介绍了一个使用WebView加载网页并实现浏览器前进后退功能的方法。通过维护一个URL栈,可以记录用户的浏览历史,并允许用户通过按键返回到前一个页面。文章详细展示了如何在Android应用中集成WebView,并提供了一个具体的实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 转载自:http://blog.youkuaiyun.com/liu1164316159/article/details/73481014
  2. public class MainActivity extends AppCompatActivity {  
  3.   
  4.     private WebView webview;  
  5.     private MyWebViewClient webViewClient;  
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.activity_main);  
  10.         webview = (WebView) findViewById(R.id.webview);  
  11.         webViewClient = new MyWebViewClient();  
  12.         webview.getSettings().setJavaScriptEnabled(true);  
  13.         webview.setWebViewClient(webViewClient);  
  14.         webview.loadUrl("https://m.taobao.com/");  
  15.     }  
  16.   
  17.   
  18.     @Override  
  19.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  20.         return pageGoBack(webview,webViewClient);  
  21.     }  
  22.   
  23.     public boolean pageGoBack(WebView web, MyWebViewClient client) {  
  24.         final String url = client.popLastPageUrl();  
  25.         if (url != null) {  
  26.             web.loadUrl(url);  
  27.             return true;  
  28.         }  
  29.         finish();  
  30.         return false;  
  31.     }  
  32.   
  33.     class MyWebViewClient extends WebViewClient{  
  34.         /** 
  35.          * 记录URL的栈 
  36.          */  
  37.         private final Stack<String> mUrls = new Stack<>();  
  38.         /** 
  39.          * 判断页面是否加载完成 
  40.          */  
  41.         private boolean mIsLoading;  
  42.         private String mUrlBeforeRedirect;  
  43.   
  44.         @Override  
  45.         public void onPageStarted(WebView view, String url, Bitmap favicon) {  
  46.             super.onPageStarted(view, url, favicon);  
  47.             if (mIsLoading && mUrls.size() > 0) {  
  48.                 mUrlBeforeRedirect = mUrls.pop();  
  49.             }  
  50.             recordUrl(url);  
  51.             this.mIsLoading = true;  
  52.         }  
  53.   
  54.         /** 
  55.          * 记录非重定向链接, 避免刷新页面造成的重复入栈 
  56.          * 
  57.          * @param url 链接 
  58.          */  
  59.         private void recordUrl(String url) {  
  60.             //这里还可以根据自身业务来屏蔽一些链接被放入URL栈  
  61.             if (!TextUtils.isEmpty(url) && !url.equalsIgnoreCase(getLastPageUrl())) {  
  62.                 mUrls.push(url);  
  63.             } else if (!TextUtils.isEmpty(mUrlBeforeRedirect)) {  
  64.                 mUrls.push(mUrlBeforeRedirect);  
  65.                 mUrlBeforeRedirect = null;  
  66.             }  
  67.         }  
  68.   
  69.         /** 
  70.          * 获取上一页的链接 
  71.          **/  
  72.         private synchronized String getLastPageUrl() {  
  73.             return mUrls.size() > 0 ? mUrls.peek() : null;  
  74.         }  
  75.   
  76.         /** 
  77.          * 推出上一页链接 
  78.          */  
  79.         public String popLastPageUrl() {  
  80.             if (mUrls.size() >= 2) {  
  81.                 mUrls.pop(); //当前url  
  82.                 return mUrls.pop();  
  83.             }  
  84.             return null;  
  85.         }  
  86.   
  87.         @Override  
  88.         public void onPageFinished(WebView view, String url) {  
  89.             super.onPageFinished(view, url);  
  90.             if (this.mIsLoading) {  
  91.                 this.mIsLoading = false;  
  92.             }  
  93.         }  
  94.         @Override  
  95.         public boolean shouldOverrideUrlLoading(WebView view, String url) {  
  96.             return false;  
  97.         }  
  98.     }  
  99. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值