目前很多Android应用都会实现按返回键时提示“再按一次推退出”
在这篇文章中总结了各家的方法,一般都是监听Activity的onKeyDown 或者onBackPressed方法
方法一:
直接计算时间差来实现。
[java] view plaincopy
final int mDuraction = 2000; // 两次返回键之间的时间差
long mLastTime = 0; // 最后一次按back键的时刻
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK) {// 截获back事件
exitApp();
return true;
} else {
return super.onKeyDown(keyCode, event);
}
}
private void exitApp() {
if(System.currentTimeMillis() - mLastTime > mDuraction) {
Toast.makeText(this, "再按一次退出", 0).show();
mLastTime = System.currentTimeMillis();
} else {
finish();
}
}
方法二:
通过Timer定时器来实现按两次退出。
[java] view plaincopy
final int mDuraction = 2000; // 两次返回键之间的时间差
private boolean isExit = false;
private Timer mTicker = null;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK) {// 截获back事件
exitByTimeTicker();
return true;
} else {
return super.onKeyDown(keyCode, event);
}
}
private void exitByTimeTicker() {
if(isExit) { // 退出应用
finish();
} else {
// 第一次按back键,弹出提示
Toast.makeText(getApplicationContext(), "再按一次退出", 0).show();
isExit = !isExit;
if(null == mTicker) {
mTicker = new Timer();
}
mTicker.schedule(new TimerTask() {
@Override
public void run() {
isExit = false; // 改变标识
}
}, mDuraction); // 如果第一次按back 2秒后没操作,则使用计时器取消退出操作的标识
}
}
方法三:
通过Handler机制,判断EXIT_WAIT消息是否存在消息队列中来判断是否是第二次点击Back键
[java] view plaincopy
final int mDuraction = 2000; // 两次返回键之间的时间差
private final int MSG_EXIT = 0x0808;
private final int MSG_EXIT_WAIT = 0x0810;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK) {// 截获back事件
mHandler.sendEmptyMessage(MSG_EXIT);
return true;
} else {
return super.onKeyDown(keyCode, event);
}
}
private Handler mHandler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_EXIT:
if(this.hasMessages(MSG_EXIT_WAIT)) {
// 如果MSG_EXIT_WAIT 还存在MessageQueue中,说明已经按了一次Back键,那么就finish当前activity
finish();
} else {
Toast.makeText(getApplicationContext(), "再按一次退出", 0).show();
this.sendEmptyMessageDelayed(MSG_EXIT_WAIT, mDuraction);
}
break;
case MSG_EXIT_WAIT:
break;
default:
break;
}
};
};