Sudheesh B Nair tem uma resposta legal (e aceita) sobre a pergunta, que eu acho que deveria ter uma alternativa melhor como;
O que há de errado em medir o tempo passado e verificar se os TIME_INTERVALmilissegundos (por exemplo, 2000) passaram desde a última pressão de retorno. O seguinte código de exemplo usa System.currentTimeMillis();para armazenar a hora em que onBackPressed()é chamada;
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();
}
De volta à crítica de resposta aceita ; Usar a flagpara indicar se ele foi pressionado nos últimos TIME_INTERVALmilisegundos (por exemplo, 2000) e o método set-reset is via foi a primeira coisa que me veio à mente. Mas a ação deve ser cancelada quando a atividade estiver sendo fechada, removendo o .HandlerpostDelayed()postDelayed()Runnable
Para remover o Runnable, ele não deve ser declarado anônimo e ser declarado como membro junto com o Handlertambém. Então o removeCallbacks()método de Handlerpode ser chamado apropriadamente.
A amostra a seguir é a demonstração;
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);
}
Agradecemos a @NSouth por contribuir; Para impedir que a mensagem do brinde apareça mesmo após o fechamento do aplicativo, Toastpode ser declarada como membro - por exemplo mExitToast- e pode ser cancelada via mExitToast.cancel();pouco antes da super.onBackPressed();chamada.