1、背景介绍
在Android开发工程中,考虑到用户的手机是触屏的,可能会不小心点到了返回按钮,如果这个时候我们的程序直接退出了,是不是不太科学呢?对吧,因此我们要想个办法解决这个问题。我们常看见一些客户端,在中间弹出一个对话框,用户点击确定之后,就退出,取消就不退出(比如建行客户端)。实际上这样的效果体验不是太好,因为我们还要将手指移动到中间去。
我们也常见一些其它手法,比如只是弹出一条提示信息,如果用户确实想退出,用户只需要在很短的时间内,再次点击退出,程序就会完全退出了。好了,我们来看看代码如何实现。
2、有Bug代码
最开始的时候,本着不重复造轮子的想法,在网上收集了一下资料,看到如下的一段代码:
private static Boolean isExit = false;
private static Boolean hasTask = false;
Timer tExit = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
isExit = false;
hasTask = true;
}
};
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if(isExit == false ) {
isExit = true;
Toast.makeText(this, "再按一次后退键退出应用程序", Toast.LENGTH_SHORT).show();
if(!hasTask) {
tExit.schedule(task, 2000);
}
} else {
finish();
System.exit(0);
}
}
return false;
}
在读完这段代码的时候,我有一个疑惑,这段代码在逻辑上好像还是有点问题。具体问题是什么呢?如果我们在一开始的时候,不小心点击了退出(本意不退出),那么我们只要不再点击退出就可以了。等我们下次想要退出的时候,依然还是要点击两次的。这是我们的需求。
然而本段代码呢,当我们在错误的情况下点击了退出,额,下次点击退出的时候程序直接退出了。。。是不是不太科学呀!!!这样会在使用过程中,很糊涂的,有时候要点击两次,有时候只需要点击一次(就是又一次误点了)。
3、我的解答
这里提供一个本人自己的解答方式,当然,也包含了网络上前人的一些智慧,嘿嘿,算是拿来主义了吧。
// 记录退出时间时候使用
private long exitTime = 0;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK
&& event.getAction() == KeyEvent.ACTION_DOWN) {
if ((System.currentTimeMillis() - exitTime) > 2000) {
Toast.makeText(getApplicationContext(), "再按一次后退键退出程序",
Toast.LENGTH_SHORT).show();
// 记录当前时间,如果是在两秒内
exitTime = System.currentTimeMillis();
} else {
// 退出代码
onDestroy();
}
return true;
}
return super.onKeyDown(keyCode, event);
}
4、其它思路
除了上面的一种解答方式之外,还有一种是第2、第3的结合体,主要是在使用定时器的时候做一个时间判断,倒计时两秒钟。如果在这两秒内用户点击了退出,程序退出;如果用户没有在这两秒内点击退出,那么要将上面的标识