现在大部分 Android 应用在主界面点击Back键时都会弹出个Toast提示:再点一次退出程序。我也在应用中加入了这个功能,起初我是想加入一个 boolean 值 或者 int 值分别根据true false和计数进行判断,后面发现这样存在问题,即点了一次后进入其他页面,再返回当当前页,只需点击一次就退出了,究其原因,无非是加入的值已经不是初始状态了,导致第二次点击时判断出错。实际上有2个方法来实现这个效果:
1. 根据2次点击事件的时间间隔判断是否连续点击了2次Back
这个方法跟防止控件的连续点击思路基本一致,定义2个变量分别用来记录两次点击事件从1970年1月1日0时起到当前的毫秒数,若2次点击事件的时间间隔小于指定时间间隔(这里设置为2秒),则算作连续点击,执行退出操作,否则弹出 Toast 提示用户,并重新赋值。
private long firstTime = 0;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
long secondTime = System.currentTimeMillis();
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (secondTime - firstTime < 2000) {
System.exit(0);
} else {
Toast.makeText(MainActivity.this, "再点一次退出程序", Toast.LENGTH_SHORT).show();
firstTime = System.currentTimeMillis();
}
return true;
}
return super.onKeyDown(keyCode, event);
}
2. 一段时间未第二次点击Back则重置变量为初始值
这个方法跟我最初的设想一样,这里添加了一个定时器用来解决前面所说的变量没有恢复到初始值的问题。
private boolean isQuit = false;
@Override
public void onBackPressed() {
if (!isQuit) {
Toast.makeText(MainActivity.this, "再点一次退出程序", Toast.LENGTH_SHORT).show();
isQuit = true;
// 在两秒钟之后重置isQuit为false
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
isQuit = false;
}
}
}).start();
} else {
System.exit(0);
}
}