Ostatnio zauważyłem ten wzór w wielu aplikacjach i grach na Androida: po kliknięciu przycisku Wstecz, aby „wyjść” z aplikacji, Toast
pojawia się komunikat podobny do tego: „Kliknij ponownie BACK, aby wyjść”.
Zastanawiam się, ponieważ coraz częściej to widzę, czy jest to wbudowana funkcja, do której można uzyskać dostęp w ramach działania? Patrzyłem na kod źródłowy wielu klas, ale nie mogę nic na ten temat znaleźć.
Oczywiście mogę dość łatwo wymyślić kilka sposobów na uzyskanie tej samej funkcjonalności (najłatwiej jest zachować wartość logiczną w działaniu, która wskazuje, czy użytkownik kliknął już raz ...), ale zastanawiałem się, czy coś już tu jest .
EDYCJA : Jak wspomniałem @LAS_VEGAS, tak naprawdę nie miałem na myśli „wyjścia” w tradycyjnym znaczeniu. (tj. zakończone) Miałem na myśli „powrót do tego, co było otwarte przed uruchomieniem działania aplikacji”, jeśli ma to sens :)
źródło
Odpowiedzi:
Myślę, że ten moduł obsługi pomaga zresetować zmienną po 2 sekundach.
źródło
Sudheesh B Nair
aby uwzględnić wyżej sugerowane komentarze.Sudheesh B Nair ma miłą (i zaakceptowaną) odpowiedź na pytanie, które moim zdaniem powinno mieć lepszą alternatywę, taką jak;
Co jest złego w mierzeniu czasu i sprawdzaniu, czy minęły
TIME_INTERVAL
milisekundy (powiedzmy 2000) od ostatniego naciśnięcia wstecz. Wywoływany jest następujący przykładowy kodSystem.currentTimeMillis();
do przechowywania czasuonBackPressed()
;Powrót do przyjętej krytyki odpowiedzi ; Używanie
flag
do wskazania, czy został wciśnięty w ostatnimTIME_INTERVAL
(powiedzmy 2000) milisekund i set - Reset jest poprzezHandler
„spostDelayed()
metoda była pierwszą rzeczą, aby przyjść w moim umyśle. AlepostDelayed()
akcja powinna zostać anulowana, gdy aktywność się zamyka, usuwającRunnable
.Aby go usunąć
Runnable
, nie można go ogłosić anonimowym i należy go również zgłosić jako członka wraz zHandler
zapisem. Następnie można odpowiednio wywołaćremoveCallbacks()
metodęHandler
Poniższa próbka to demonstracja;
Dzięki @NSouth za wkład; Aby zapobiec pojawianiu się wiadomości toast nawet po zamknięciu aplikacji,
Toast
można ją zadeklarować jako członka - powiedzmymExitToast
- i można ją anulowaćmExitToast.cancel();
bezpośrednio przedsuper.onBackPressed();
połączeniem.źródło
Pomyślałem, że w końcu podzielę się tym, jak to zrobiłem, dodałem w swojej działalności:
I to działa dokładnie tak, jak chcę. Łącznie z resetowaniem stanu przy każdym wznowieniu działania.
źródło
Back
raz, a następnieBack
jeszcze raz minutę później, a aplikacja zostanie zamknięta. Tego nie będzie oczekiwał użytkownik.Schemat przebiegu procesu:
Kod Java:
źródło
Wśród tych wszystkich odpowiedzi jest bardzo najprostszy sposób.
Po prostu napisz następujący kod w
onBackPressed()
metodzie.Musisz zdefiniować
back_pressed
obiekt jaklong
w działaniu.źródło
Moje rozwiązanie z użyciem paska przekąskowego:
Prosty i stylowy.
źródło
W oparciu o poprawną odpowiedź i sugestie w komentarzach, stworzyłem demo, które działa absolutnie dobrze i usuwa wywołania programu obsługi po użyciu.
MainActivity.java
Mam nadzieję, że będzie to pomocne !!
źródło
onBackPressed()
naprawić problem wycieku pamięci ?Deklaruj zmienną
private boolean doubleBackToExitPressedOnce = false;
źródło
Nie jest dobrym pomysłem używanie Runnable po wyjściu z aplikacji, ostatnio wymyśliłem znacznie prostszy sposób rejestrowania i porównywania okresu między dwoma kliknięciami przycisku BACK. Przykładowy kod w następujący sposób:
To sprawi, że wyjdziesz z aplikacji podwójnym kliknięciem przycisku BACK w pewnym okresie opóźnienia, który wynosi 2000 milisekund w próbce.
źródło
Zaakceptowana odpowiedź jest najlepsza, ale jeśli używasz
Android Design Support Library
, możesz użyćSnackBar
dla lepszych widoków.źródło
To nie jest wbudowana funkcjonalność. Myślę, że to nawet nie jest zalecane zachowanie. Aplikacje na Androida nie są przeznaczone do wyjścia:
Dlaczego aplikacje na Androida nie oferują opcji „Wyjdź”?
źródło
Na koniec utwórz onBackPressedMethod w następujący sposób:
Działa to poprawnie, przetestowałem. i myślę, że jest to o wiele prostsze.
źródło
Odpowiedź Zefnusa przy użyciu System.currentTimeMillis () jest najlepsza (+1). Sposób, w jaki to zrobił to nie lepsze niż to, ale nadal opublikowania go dodać do powyższych pomysłów.
Jeśli toast nie jest widoczny po naciśnięciu przycisku Wstecz, toast jest wyświetlany, a jeśli jest widoczny (tył został już naciśnięty jeden raz w ostatnim
Toast.LENGTH_SHORT
czasie), to wychodzi.źródło
Ostatnio musiałem zaimplementować tę funkcję przycisku Wstecz w mojej aplikacji. Odpowiedzi na pierwotne pytanie były przydatne, ale musiałem wziąć pod uwagę jeszcze dwa punkty:
Na podstawie odpowiedzi i komentarzy stworzyłem następujący kod:
Powyższy kod zakłada, że używana jest biblioteka obsługi. Jeśli używasz fragmenty, ale nie z biblioteki wsparcia, chcesz zastąpić
getSupportFragmentManager()
przezgetFragmentManager()
.Usuń pierwszy
if
, jeśli przycisk Wstecz nigdy nie jest anulowany. Usuń drugiif
, jeśli nie używasz fragmentów lub stosu fragmentówWażne jest również, aby pamiętać, że metoda
onBackPressed
jest obsługiwana od Androida 2.0. Sprawdź tę stronę, aby uzyskać szczegółowy opis. Aby funkcja back press działała również w starszych wersjach, dodaj następującą metodę do swojej aktywności:źródło
W java
W kotlinie
źródło
Wiem, że to bardzo stare pytanie, ale jest to najłatwiejszy sposób na robienie tego, co chcesz.
Wiem, że to nie jest najlepsza metoda, ale działa dobrze!
źródło
W tym celu wdrożyłem następującą funkcję:
źródło
Pomaga to również wtedy, gdy poprzednia aktywność stosu jest zapisana w stosie.
Zmodyfikowałem odpowiedź Sudheesh
źródło
źródło
Myślę, że jest to nieco lepsza metoda niż Zefnus . Wywołaj System.currentTimeMillis () tylko jeden raz i pomiń
return;
:źródło
Oto pełny działający kod. Nie zapomnij również usunąć wywołań zwrotnych, aby nie spowodowało to wycieku pamięci w aplikacji. :)
źródło
Tutaj uogólniłem napisanie kodu dla liczby zliczeń N. Kod jest podobnie napisany dla opcji Enable Developer w telefonie z systemem Android. Nawet ty możesz tego użyć, aby włączyć funkcje podczas testowania aplikacji przez programistę.
Wywołaj askToExit () w opcji backpress lub wylogowania.
źródło
używam tego
użyj w przypadku
onBackPressed
lub
ExitApp.now(this,R.string.double_back_pressed)
do zmiany sekund potrzeba zamknięcia, określonych milisekund
ExitApp.now(this,R.string.double_back_pressed,5000)
źródło
Gdy HomeActivity zawiera szufladę nawigacji i funkcję backPressed (), aby wyjść z aplikacji. (Nie zapomnij zainicjować zmiennej globalnej boolean doubleBackToExitPressedOnce = false;) nowy moduł obsługi po 2 sekundach ustaw zmienną doubleBackPressedOnce na false
źródło
źródło
Kilka ulepszeń w odpowiedzi Sudheesh B Naira, zauważyłem, że będzie czekał na moduł obsługi, nawet natychmiast naciskając dwukrotnie, więc anuluj moduł obsługi, jak pokazano poniżej. Anulowałem także toast, aby nie wyświetlał się po zamknięciu aplikacji.
źródło
To jest tak samo jak zaakceptowana i najczęściej głosowana odpowiedź, ale ten wycięty użył Snackbar zamiast Toast.
źródło
W moim przypadku polegam na
Snackbar#isShown()
lepszeUX
.źródło
W przypadku działania, które ma szufladę nawigacji , użyj następującego kodu dla OnBackPressed ()
źródło
Oto inny sposób ... przy użyciu metody CountDownTimer
źródło