private static Boolean isExit = false; private static Boolean hasTask = false; Timer tExit = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { isExit = false; hasTask = true; } }; public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if(keyCode == KeyEvent.KEYCODE_BACK){ // System.out.println("user back down"); if(isExit == false ) { isExit = true; Toast.makeText(this, "再按一次退出程式", Toast.LENGTH_SHORT).show(); if(!hasTask) { tExit.schedule(task, 2000); }} else { } finish(); System.exit(0); } } return false; }
下面程式是我根據上面網上程式改的。因為那個程式稍微有點瑕疵,問題是:當按下返回鍵後,2秒後再按返回鍵,這時isExit已經被設定為true,不能在第三次按返回鍵時起到想要的效果,而是直接退出。
我的想法,只要使用者按下返回鍵就設定一個定時器來監控是否2秒內實現了退出,如果使用者沒有接著按返回鍵,則清除第一次按返回鍵的效果,使程式還原到第一次按下返回鍵之前的狀態。這個定時器是每次使用者按下返回鍵才去建立,而不是像上面程式啟動就已經建立。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode == KeyEvent.KEYCODE_BACK)
{
exitBy2Click();//調用雙擊退出函數
}
return false;
}
//準備退出
private static Boolean isExit = false;
private void exitBy2Click()
{
Timer tExit = null;
if(isExit == false )
{
isExit = true; //準備退出
Toast.makeText(this, "再按一次退出程式", Toast.LENGTH_SHORT).show();
tExit = new Timer();
tExit.schedule(new TimerTask() {
@Override
public void run() {
isExit = false; //取消退出
}
}, 2000); //如果2秒鐘內沒有按下返回鍵,則啟動定時器取消掉剛才執行的任務
}else{
finish();
System.exit(0);
}
}