Sudheesh B Nair ma miłą (i zaakceptowaną) odpowiedź na pytanie, które moim zdaniem powinno mieć lepszą alternatywę, taką jak;
Co jest złego w mierzeniu czasu i sprawdzaniu, czy minęły TIME_INTERVAL
milisekundy (powiedzmy 2000) od ostatniego naciśnięcia wstecz. Wywoływany jest następujący przykładowy kod System.currentTimeMillis();
do przechowywania czasu 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();
}
Powrót do przyjętej krytyki odpowiedzi ; Używanie flag
do wskazania, czy został wciśnięty w ostatnim TIME_INTERVAL
(powiedzmy 2000) milisekund i set - Reset jest poprzez Handler
„s postDelayed()
metoda była pierwszą rzeczą, aby przyjść w moim umyśle. Ale postDelayed()
akcja powinna zostać anulowana, gdy aktywność się zamyka, usuwając Runnable
.
Aby go usunąć Runnable
, nie można go ogłosić anonimowym i należy go również zgłosić jako członka wraz z Handler
zapisem. Następnie można odpowiednio wywołać removeCallbacks()
metodęHandler
Poniższa próbka to demonstracja;
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);
}
Dzięki @NSouth za wkład; Aby zapobiec pojawianiu się wiadomości toast nawet po zamknięciu aplikacji, Toast
można ją zadeklarować jako członka - powiedzmy mExitToast
- i można ją anulować mExitToast.cancel();
bezpośrednio przed super.onBackPressed();
połączeniem.