第一种、
private static boolean mBackKeyPressed = false; //记录是否有首次按键
@Override
public void onBackPressed() {
if(!mBackKeyPressed){ //如果mBackKeyPressed不等于false(那就是true咯)
Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show(); //提示再按一次退出
mBackKeyPressed = true; //把mBackKeyPressed设置为true
new Timer().schedule(new TimerTask() { //延时两秒,如果超出则擦错第一次按键记录
@Override
public void run() {
mBackKeyPressed = false; //时间超过2秒,把mBackKeyPressed设回false
}
}, 2000); //2000单位是毫秒等于2秒
}else{ //否则退出程序
this.finish();
System.exit(0);
}
}
//整个代码思路就是:用一个mBackKeyPressed的布尔值判断是否在两秒内按下两次返回键,第一次按下时提示再按一次退出,如果Timer倒计时2秒结束后,就把第一次按的记录去除,也就是把mBackKeyPressed设会false,如果在Timer倒计时没结束时,也就是mBackKeyPressed的值还是ture时,那么if中的!mBackKeyPressed的值为false,就执行else语句,就是退出程序。if(!mBackKeyPressed)/*直观就是if(!false)*/!false等于true,就执行if语句中的代码,当Timer中的run方法还没执行时,也就是没倒计时完毕时,mBackKeyPressed是等于true,这是如果再次按下返回键,if(!mBackKeyPressed)/*直观就是if(!true)*/!true等于false,那就是执行else里面的语句了。
true == true;
!true == false;
false == false;
!false == true;
第二种、
private long mPressedTime = 0; //保存上一次按下返回键的时间
@Override
public void onBackPressed() {
long mNowTime = System.currentTimeMillis(); //获取第一次按键时间单位为毫秒,把值赋给mNowTime
if((mNowTime - mPressedTime) > 2000){ //比较两次按键时间差,如果减去上一次按的时间小于2000毫秒就执行if里面的代码
Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show(); //提示再按一次退出
mPressedTime = mNowTime; //把这一次获取的时间赋给mPressedTime,mPressedTime用来保存上一次按下返回键的时间
}
else{ //退出程序
this.finish();
System.exit(0);
}
}
//整个代码的思路分析:用mPressedTime记录上一次的时间(毫秒),mNowTime记录当前按下返回键的时间(毫秒),if语句意思是如果这一次获取到的时间(毫秒)减去上一次获取到的时间(毫秒)的值大于2000,比如4000-3000=1000,值不大于2000,也就是两次按下的时间不相差2秒,则if条件不成立将执行else中的代码,即退出程序,比如5000-2000=3000,相差时间超过2秒,超过双击退出的一般时间,则重新提示再按一次退出!最简单说就是,如果是第一次点击,这次获取到的时间减去上一次的时间肯定比上一次相差大于2000,就提示再点击退出,如果是第二次点击比上一次点击大于2000还是提示再点就退出,如果第二次和上一次点击的时间相差不到2000,那么就if条件不成立,则是执行else中的代码!