Sudheesh B Nair ha una buona (e accettata) risposta alla domanda, che penso dovrebbe avere un'alternativa migliore come;
Cosa c'è che non va nel misurare il tempo trascorso e nel controllare se i TIME_INTERVAL
millisecondi (diciamo 2000) sono passati dall'ultima stampa di ritorno. Il seguente codice di esempio utilizza System.currentTimeMillis();
per memorizzare l'ora onBackPressed()
viene chiamata;
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();
}
Torna alla critica della risposta accettata ; Usare a flag
per indicare se è stato premuto negli ultimi TIME_INTERVAL
(diciamo 2000) millisecondi e il set - reset è tramite Handler
il postDelayed()
metodo è stata la prima cosa che mi è venuta in mente. Ma l' postDelayed()
azione dovrebbe essere annullata quando l'attività si sta chiudendo, rimuovendo il Runnable
.
Per rimuovere il Runnable
, non deve essere dichiarato anonimo e dichiarato come membro insieme Handler
. Quindi il removeCallbacks()
metodo di Handler
può essere chiamato in modo appropriato.
Il seguente esempio è la dimostrazione;
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);
}
Grazie a @NSouth per il contributo; Al fine di evitare che appaiano messaggi di brindisi anche dopo la chiusura dell'applicazione, Toast
possono essere dichiarati come membri - diciamo mExitToast
- e possono essere cancellati mExitToast.cancel();
appena prima della super.onBackPressed();
chiamata.