目前很多Android应用都会实现按返回键时提示“再按一次推退出”在这篇文章中总结了各家的方法,一般都是监听Activity的onKeyDown 或者onBackPressed方法方法一:直接计算时间差来实现。[java] view plaincopyfinal 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 plaincopyfinal 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 plaincopyfinal 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; } }; };