问题出现的场景很常见,比如webview 先加载一个oauth url,成功后重定向到url_b。那个按物理返回键的时候webview会goBack 到过度的oauth url,马上又被重定向到url_b。也就是返回键好像失效了。(当然快速按2次可以解决,可是用户不希望这样)
解决的思路是load(oauth_url)重定向到url_b 的时候先标记isGoBack=true.
在onPageStarted 中的url 是 oauth_url,但是
shouldOverrideUrlLoading中是url_b.
根据两次的不一样可以进行如下处理和标识位复位
1. isGoBack = false;
2. if (mWebView.canGoBack()) {
mWebView.goBack();
} else {
killWebProcess();
}
首先 我们Custom了 WebViewClient
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (!TextUtils.isEmpty(startUrl) && !startUrl.equals(url) && isGoBack&&System.currentTimeMillis() - resumeTime<600) {
isGoBack = false;
if (mWebView.canGoBack()) {
mWebView.goBack();
} else {
killWebProcess();
}
} else {
view.loadUrl(url, getHeaders(url));
isGoBack = false;
return true;
}
return false;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
startUrl = url;
}
其次处理返回键
boolean isGoBack = false;
private long resumeTime = 0;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
isGoBack = true;
resumeTime = System.currentTimeMillis();
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
上面的代码中有System.currentTimeMillis() - resumeTime<600 这个是为了干嘛呢?
防止上一次按返回键真的只是一次goBack() !!! 去掉你就会知道问题,遇到了就加上
完整代码在 MVP-Dagger2-Rxjava2中搜索代码类 BaseWebViewActivity
More,Cantact me at: anylife.zlb@gmail.com
网友评论