Sudheesh B Nair 's має гарну (і прийняту) відповідь на питання, яке, на мою думку, повинно мати кращу альтернативу, таку як;
Що не так у вимірюванні пройденого часу та перевірці, чи минули 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
авелером. Тоді 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();
викликом.