Android实现 再按一次退出 的三种方法 durationTime、timerTask 和Handler

目前很多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;  
        }  
    };  
};  
原文地址:https://www.cnblogs.com/Free-Thinker/p/4580599.html