В последнее время я заметил этот паттерн во многих приложениях и играх для Android: при нажатии кнопки «Назад» для «выхода» из приложения Toast
появляется сообщение, похожее на «Пожалуйста, нажмите НАЗАД еще раз, чтобы выйти».
Мне было интересно, поскольку я вижу это все чаще и чаще, это встроенная функция, к которой вы можете как-то получить доступ в действии? Я посмотрел на исходный код многих классов, но, похоже, ничего не могу найти по этому поводу.
Конечно, я могу придумать несколько способов достичь той же функциональности довольно легко (возможно, самый простой - сохранить логическое значение в действии, которое указывает, нажал ли пользователь уже один раз ...), но мне было интересно, есть ли здесь что-то уже ,
РЕДАКТИРОВАТЬ : Как упоминалось @LAS_VEGAS, я не имел в виду «выход» в традиционном смысле. (то есть прекращено) Я имел в виду «вернуться к тому, что было открыто до запуска активности запуска приложения», если это имеет смысл :)
источник
Ответы:
Думаю, этот обработчик помогает сбросить переменную через 2 секунды.
источник
Sudheesh B Nair
чтобы покрыть вышеупомянутые предложенные комментарии.У Sudheesh B Nair есть хороший (и принятый) ответ на вопрос, который, я думаю, должен иметь лучшую альтернативу, такую как;
Что не так с измерением пройденного времени и проверкой того, прошли ли
TIME_INTERVAL
миллисекунды (скажем, 2000) с момента последнего нажатия. Следующий пример кода используетсяSystem.currentTimeMillis();
для сохранения времениonBackPressed()
вызова;Назад на принятый ответ критика ; Использование
flag
для указания , если она была нажата в прошломTIME_INTERVAL
(скажем , 2000) миллисекунды и набор - сброс осуществляется черезHandler
«SpostDelayed()
метод был первым , что приходит на мой взгляд. НоpostDelayed()
действие должно быть отменено, когда действие закрывается, удаляяRunnable
.Для того, чтобы удалить
Runnable
, он не должен быть объявлен анонимным , а также должен быть объявлен как участник вместе сHandler
aswell. ТогдаremoveCallbacks()
методHandler
может быть вызван соответствующим образом.Следующий пример - демонстрация;
Спасибо @NSouth за помощь; Чтобы предотвратить появление всплывающего сообщения даже после закрытия приложения, оно
Toast
может быть объявлено как член, скажем,mExitToast
и может быть отмененоmExitToast.cancel();
непосредственно передsuper.onBackPressed();
вызовом.источник
Просто подумал, что поделюсь, как я это сделал в конце, я просто добавил в свою деятельность:
И это работает именно так, как я хочу. Включая сброс состояния при возобновлении активности.
источник
Back
один раз, а затем нажмите ещеBack
раз через минуту, и приложение закроется. Это не то поведение, которого ожидает пользователь.Диаграмма процесса:
Java-код:
источник
Среди всех этих ответов есть очень простой способ.
Просто напишите следующий код внутри
onBackPressed()
метода.Вам нужно определить
back_pressed
объект какlong
в деятельности.источник
Мое решение с использованием закусочной:
Просто и стильно.
источник
Основываясь на правильном ответе и предложениях в комментариях, я создал демо, которое работает абсолютно нормально и удаляет обратные вызовы обработчика после использования.
MainActivity.java
Я надеюсь, что это будет полезно!
источник
onBackPressed()
устранить проблему утечки памяти ?Объявить переменную
private boolean doubleBackToExitPressedOnce = false;
источник
Не рекомендуется использовать Runnable при выходе из приложения. Недавно я нашел гораздо более простой способ записать и сравнить период между двумя нажатиями кнопки BACK. Пример кода следующий:
Это сделает выход из приложения двойным нажатием кнопки BACK в течение определенного периода задержки, который составляет 2000 миллисекунд в выборке.
источник
Принятый ответ - лучший, но если вы используете его,
Android Design Support Library
вы можете использовать егоSnackBar
для лучшего просмотра.источник
Это не встроенный функционал. Я думаю, что это даже не рекомендуемое поведение. Приложения Android не предназначены для выхода:
Почему приложения Android не предоставляют опцию «Выход»?
источник
Наконец, создайте метод onBackPressedMethod следующим образом:
Это работает правильно, я проверил. и я думаю, что это намного проще.
источник
Ответ Зефнуса с использованием System.currentTimeMillis () является лучшим (+1). То, как я это сделал, ничуть не лучше этого, но все же выкладываю его, чтобы добавить к вышеупомянутым идеям.
Если тост не виден при нажатии кнопки «Назад», тост отображается, а если он виден (назад уже был нажат один раз в последний
Toast.LENGTH_SHORT
раз), то он выходит.источник
Недавно мне нужно было реализовать эту функцию кнопки назад в моем приложении. Ответы на первоначальный вопрос были полезны, но мне пришлось принять во внимание еще два момента:
Основываясь на ответах и комментариях, я создал следующий код:
Код выше предполагает, что используется библиотека поддержки. Если вы используете фрагменты, но не библиотеку поддержки, вы хотите заменить
getSupportFragmentManager()
наgetFragmentManager()
.Снимите первый
if
, если кнопка возврата никогда не отменяется. Удалите второеif
, если вы не используете фрагменты или фрагмент стека обратноТакже важно знать, что этот метод
onBackPressed
поддерживается начиная с Android 2.0. Проверьте эту страницу для подробного описания. Чтобы функция обратной печати работала и на более старых версиях, добавьте в свою деятельность следующий метод:источник
В яве
В котлине
источник
Я знаю, что это очень старый вопрос, но это самый простой способ сделать то, что вы хотите.
Я знаю, что это не лучший метод, но он отлично работает!
источник
Для этого я реализовал следующую функцию:
источник
Это также помогает, когда в стеке хранится предыдущая активность стека.
Я изменил ответ Судхиша
источник
источник
Я думаю, что этот метод немного лучше, чем у Зефнуса . Вызовите System.currentTimeMillis () только один раз и пропустите
return;
:источник
Вот полный рабочий код. А также не забудьте удалить обратные вызовы, чтобы это не вызывало утечку памяти в приложении. :)
источник
Здесь я обобщенно написал код для N счетчиков. Аналогичным образом код написан для опции «Включить разработчика» на телефоне с Android. Даже вы можете использовать это для включения функций во время тестирования приложения разработчиком.
Вызовите askToExit () для опции backpress или logout.
источник
Я использую это
использовать в случае
onBackPressed
или
ExitApp.now(this,R.string.double_back_pressed)
для смены секунд необходимо закрыть, указанные миллисекунды
ExitApp.now(this,R.string.double_back_pressed,5000)
источник
Когда HomeActivity содержит блок навигации и двойную функцию backPressed () для выхода из приложения. (Не забудьте инициализировать глобальную переменную boolean doubleBackToExitPressedOnce = false;) Новый обработчик через 2 секунды устанавливает переменную doubleBackPressedOnce в значение false
источник
источник
Некоторые улучшения в ответе Sudheesh B Nair, я заметил, что он будет ждать обработчика даже при немедленном двойном нажатии, поэтому отмените обработчик, как показано ниже. Я также отменил тост, чтобы он не отображался после выхода из приложения.
источник
Это тот же самый принятый и получивший наибольшее количество голосов ответ, но вместо этого использовался снэк-бар вместо тоста.
источник
В моем случае, я полагаюсь на
Snackbar#isShown()
лучшееUX
.источник
Для действия, в котором есть Навигационный ящик , используйте следующий код для OnBackPressed ()
источник
Вот еще один способ ... используя метод CountDownTimer
источник