Sudheesh B Nair tiene una respuesta agradable (y aceptada) sobre la pregunta, que creo que debería tener una mejor alternativa como;
¿Qué hay de malo en medir el tiempo transcurrido y verificar si TIME_INTERVALpasaron milisegundos (por ejemplo, 2000) desde la última vez que presionó hacia atrás? Se llama al siguiente código de muestra System.currentTimeMillis();para almacenar el tiempo 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();
}
Volver a la respuesta aceptada crítica ; El uso de a flagpara indicar si se presionó en los últimos TIME_INTERVALmilisegundos (por ejemplo, 2000) y se estableció el restablecimiento mediante Handlerel postDelayed()método fue lo primero que se me ocurrió. Pero la postDelayed()acción debe cancelarse cuando se cierra la actividad, eliminando el Runnable.
Para eliminarlo Runnable, no debe declararse anónimo , y debe declararse como miembro junto con el Handlertambién. Entonces removeCallbacks()método deHandler puede ser llamado apropiadamente.
La siguiente muestra es la demostración;
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);
}
Gracias a @NSouth por contribuir; Para evitar que aparezcan mensajes de brindis incluso después de cerrar la aplicación, Toastpuede declararse como miembro, digamos mExitToast, y puede cancelarse mExitToast.cancel();justo antes de la super.onBackPressed();llamada.