Android WebView返回历史而不重定向

Android WebView返回历史而不重定向,android,google-chrome,browser,android-webview,Android,Google Chrome,Browser,Android Webview,我为backkey实现了androidwebview和onKeyDown方法。(它实现了webview.goBack();) 我的问题与下面这篇文章中的问题完全相似(没有答案) 问题-当我按下“后退”按钮时,webview选择上一个URL,但如果该URL实际上是重定向,它就会进入这种恶性循环。如果您查看chrome或stock browser,它会正确处理背面,而不会返回重定向 如何解决这个问题 示例:访问gap.com。然后选择“我的Gap信用卡”。这将打开一个重定向链接,然后打开最后一页。

我为backkey实现了androidwebview和onKeyDown方法。(它实现了
webview.goBack();

我的问题与下面这篇文章中的问题完全相似(没有答案)

问题-当我按下“后退”按钮时,
webview
选择上一个URL,但如果该URL实际上是重定向,它就会进入这种恶性循环。如果您查看chrome或stock browser,它会正确处理背面,而不会返回重定向

如何解决这个问题

示例:访问gap.com。然后选择“我的Gap信用卡”。这将打开一个重定向链接,然后打开最后一页。现在,当我点击后退,它永远不会进入Gap.com主页

任何建议


附加信息:我确实实现了
shouldOverrideUrlLoading
。如果我删除了这个方法,它似乎工作得很好,但使用这个方法它就不…

我刚刚在jellybean上测试了这个方法,它似乎工作得很好

本质上,每当在WebView中加载新URL时,都要保留URL的副本

在下一个URL请求中,再次检查他们是否已经在该页面上,如果他们已经在该页面上,则返回webview历史记录中的另一个步骤

本质上,这取决于传递到覆盖步骤的url是重定向的url,而不是最终重定向的url

public class MainActivity extends Activity {

    private Button mRefreshButton;
    private WebView mWebView;
    private String mCurrentUrl;

    public void onCreate(Bundle savedInstance) {
        super.onCreate(savedInstance);
        setContentView(R.layout.main);

        mWebView = (WebView) findViewById(R.id.webview);
        mRefreshButton = (Button) findViewById(R.id.refresh);

        mRefreshButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 mWebView.reload();
            }
        });

        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);

        mWebView.setWebViewClient(new WebViewClient() {

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if(mCurrentUrl != null && url != null && url.equals(mCurrentUrl)) {
                    mWebView.goBack();
                    return true;
                }

                view.loadUrl(url);
                mCurrentUrl = url;
                return true;
            }
        });

        mWebView.loadUrl("http://www.gap.com/");
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(event.getAction() == KeyEvent.ACTION_DOWN) {
            switch(keyCode) {
                case KeyEvent.KEYCODE_BACK:
                    if(mWebView.canGoBack()){
                        mWebView.goBack();
                        return true;
                    }
                    break;
            }

        }
        return super.onKeyDown(keyCode, event);
    }
}

如果有人还在寻找,我希望这个答案。我一直在寻找解决项目中类似问题的方法,并尝试了多种方法,如使用 -WebView.HitTestResult -将URL推送到列表中 -onKeyDown等等。。。 我认为,如果你的应用程序只包含webview,那么大部分功能都可以使用。但是我的项目结合了本机和webview,并处理一些本机模式

基本上,我们发现关键在于重写方法shouldOverrideUrlLoading的方式。因为我想让我的应用程序处理一些URL,让webview处理其他一些URL,特别是后台处理

@Override
public void onBackPressed() {
  if (mWebView.canGoBack()) {
    mClient.setIsBackPressed(true);
    //mClient is an instance of the MyWebviewClient
    mWebView.goBack();
  } else {
    super.onBackPressed();
  }
}

public class MyWebviewClient extends WebViewClient {

  private Boolean isBackPressed = false;

  public void setIsBackPressed(Boolean isBackPressed) {
      this.isBackPressed = isBackPressed;
  }

  @Override
  public boolean shouldOverrideUrlLoading(WebView view, String url) {
      if (isBackPressed){
          return false;
      }
      else {
          // handle the url by implementing your logic
          return true;
      }
  }

  @Override
  public void onPageFinished(WebView view, String url) {
      isBackPressed = false;
      super.onPageFinished(view, url);
  }
}
这样,当您单击“上一步”时,只要有重定向,它就会返回false,从而模拟webview的行为。同时,确保在页面完成加载后,isBackPressed设置为false。
希望这有帮助

您可以研究android浏览器实现这一点的方式。但这是一大堆代码。我猜它可能在
BrowserActivity.java
Controller.java
中的某个地方。我的onBackPressed()不起作用……我需要单击两次才能返回上一页