场景:我们的现在开发的App基本都会嵌入一些网页是内容更加的丰满。我们在网页展示页面想点击返回键退出到前一个页面。当退出到最开始的页面的时候直接退出当前的Activity。通常的做法是,监听返回键,判断页面栈是否可以回退。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event){
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){
if (showLoadingWeb.canGoBack()){
showLoadingWeb.goBack();
}else {
finish();
overridePendingTransition(R.anim.left_fadein,R.anim.left_fadeout);
}
return true;
}else {
return super.onKeyDown(keyCode , event);
}
}
但是,当我们起步时加载的页面含有重定向操作的时候再用这一套逻辑就体验很差了,会给用户一种永远退不出去的感觉。这就需要动态的查看WebView页面栈,根据页面栈中的页面的数量控制Activity的关闭。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event){
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){
if (showLoadingWeb.canGoBack()){
if (showLoadingWeb.copyBackForwardList().getSize()<=2){
finish();
overridePendingTransition(R.anim.left_fadein,R.anim.left_fadeout);
}else {
showLoadingWeb.goBack();
}
}else {
finish();
overridePendingTransition(R.anim.left_fadein,R.anim.left_fadeout);
}
return true;
}else {
return super.onKeyDown(keyCode , event);
}
}
//WebBackForwardList list = webViewInstance.copyBackForwardList();
//以上注释是对核心代码的一个解释说明 这样会看的更清晰一点
以上代码中,当页面栈大小为2的时候,就是用户视角下的根页面。但是它并没有达到页面栈的栈底,通过canGoBack()判断依然是返回true的。于是乎简单粗暴的判断页面栈的数量小于2直接关闭Activity。