У Sudheesh B Nair есть хороший (и принятый) ответ на вопрос, который, я думаю, должен иметь лучшую альтернативу, такую как;
Что не так с измерением пройденного времени и проверкой того, прошли ли TIME_INTERVAL
миллисекунды (скажем, 2000) с момента последнего нажатия. Следующий пример кода используется System.currentTimeMillis();
для сохранения времени onBackPressed()
вызова;
private static final int TIME_INTERVAL = 2000; // # milliseconds, desired time passed between two back presses.
private long mBackPressed;
@Override
public void onBackPressed()
{
if (mBackPressed + TIME_INTERVAL > System.currentTimeMillis())
{
super.onBackPressed();
return;
}
else { Toast.makeText(getBaseContext(), "Tap back button in order to exit", Toast.LENGTH_SHORT).show(); }
mBackPressed = System.currentTimeMillis();
}
Назад на принятый ответ критика ; Использование flag
для указания , если она была нажата в прошлом TIME_INTERVAL
(скажем , 2000) миллисекунды и набор - сброс осуществляется через Handler
«S postDelayed()
метод был первым , что приходит на мой взгляд. Но postDelayed()
действие должно быть отменено, когда действие закрывается, удаляя Runnable
.
Для того, чтобы удалить Runnable
, он не должен быть объявлен анонимным , а также должен быть объявлен как участник вместе с Handler
aswell. Тогда removeCallbacks()
метод Handler
может быть вызван соответствующим образом.
Следующий пример - демонстрация;
private boolean doubleBackToExitPressedOnce;
private Handler mHandler = new Handler();
private final Runnable mRunnable = new Runnable() {
@Override
public void run() {
doubleBackToExitPressedOnce = false;
}
};
@Override
protected void onDestroy()
{
super.onDestroy();
if (mHandler != null) { mHandler.removeCallbacks(mRunnable); }
}
@Override
public void onBackPressed() {
if (doubleBackToExitPressedOnce) {
super.onBackPressed();
return;
}
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();
mHandler.postDelayed(mRunnable, 2000);
}
Спасибо @NSouth за помощь; Чтобы предотвратить появление всплывающего сообщения даже после закрытия приложения, оно Toast
может быть объявлено как член, скажем, mExitToast
и может быть отменено mExitToast.cancel();
непосредственно перед super.onBackPressed();
вызовом.