Ich habe dieses Muster in letzter Zeit in vielen Android-Apps und -Spielen bemerkt: Wenn Sie auf die Schaltfläche "Zurück" klicken, um die Anwendung zu "beenden", a Toast
zu beenden, wird eine Meldung angezeigt, die der Meldung "Zum Beenden erneut auf ZURÜCK klicken" ähnelt.
Ich habe mich gefragt, wie ich es immer öfter sehe, ob dies eine integrierte Funktion ist, auf die Sie in einer Aktivität irgendwie zugreifen können. Ich habe mir den Quellcode vieler Klassen angesehen, aber ich kann anscheinend nichts darüber finden.
Natürlich kann ich mir ein paar Möglichkeiten überlegen, um die gleiche Funktionalität ganz einfach zu erreichen (am einfachsten ist es wahrscheinlich, einen Booleschen Wert in der Aktivität beizubehalten, der angibt, ob der Benutzer bereits einmal geklickt hat ...), aber ich habe mich gefragt, ob hier bereits etwas vorhanden ist .
EDIT : Wie @LAS_VEGAS erwähnte, meinte ich nicht wirklich "Beenden" in der traditionellen Bedeutung. (dh beendet) Ich meinte "Zurück zu dem, was vor dem Start der Anwendungsstartaktivität geöffnet war", wenn das Sinn macht :)
quelle
Antworten:
Ich denke, dieser Handler hilft, die Variable nach 2 Sekunden zurückzusetzen.
quelle
Sudheesh B Nair
, um die oben vorgeschlagenen Kommentare abzudecken.Sudheesh B Nair hat eine nette (und akzeptierte) Antwort auf die Frage, die meiner Meinung nach eine bessere Alternative haben sollte, wie z.
Was ist falsch daran, die verstrichene Zeit zu messen und zu überprüfen, ob
TIME_INTERVAL
seit dem letzten Zurückdrücken Millisekunden (z. B. 2000) vergangen sind ? Der folgende BeispielcodeSystem.currentTimeMillis();
zum Speichern der UhrzeitonBackPressed()
wird aufgerufen.Zurück auf akzeptierte Antwort Kritik ; Verwendung einer
flag
um anzuzeigen , ob es in der letzten gedrückt wurdeTIME_INTERVAL
(etwa 2000) Millisekunden und Set - Reset ist überHandler
‚s -postDelayed()
Methode das erste , was in meinem Kopf zu kommen war. DiepostDelayed()
Aktion sollte jedoch abgebrochen werden, wenn die Aktivität geschlossen wirdRunnable
.Um das zu entfernen
Runnable
, darf es nicht anonym deklariert und zusammen mit demHandler
as auch als Mitglied deklariert werden. DannremoveCallbacks()
Methode vonHandler
kann die entsprechend aufgerufen werden.Das folgende Beispiel ist die Demonstration;
Vielen Dank an @NSouth für Ihren Beitrag. Um zu verhindern, dass Toastnachrichten auch nach dem Schließen der Anwendung angezeigt werden,
Toast
können sie beispielsweise als Mitglied deklariertmExitToast
und übermExitToast.cancel();
kurz zuvor gekündigt werdensuper.onBackPressed();
Anruf .quelle
Ich dachte nur, ich würde erzählen, wie ich es am Ende gemacht habe, und habe gerade in meiner Aktivität hinzugefügt:
Und es funktioniert genau so, wie ich es will. Einschließlich des Zurücksetzens des Status, wenn die Aktivität fortgesetzt wird.
quelle
Back
einmal drückenBack
und eine Minute später erneut drücken, und die Anwendung wird beendet. Dies ist nicht das Verhalten, das der Benutzer erwarten wird.Prozessablaufdiagramm:
Java Code:
quelle
Unter all diesen Antworten gibt es den einfachsten Weg.
Schreiben Sie einfach den folgenden Code in die
onBackPressed()
Methode.Sie müssen das
back_pressed
Objekt wielong
in der Aktivität definieren.quelle
Meine Lösung mit Snackbar:
Einfach und stilvoll.
quelle
Basierend auf der richtigen Antwort und den Vorschlägen in den Kommentaren habe ich eine Demo erstellt, die absolut einwandfrei funktioniert und die Handler-Rückrufe nach der Verwendung entfernt.
MainActivity.java
Ich hoffe es wird hilfreich sein !!
quelle
onBackPressed()
um das Problem mit dem Speicherverlust zu beheben ?Variable deklarieren
private boolean doubleBackToExitPressedOnce = false;
quelle
Es ist keine gute Idee, beim Beenden der Anwendung ein Runnable zu verwenden. Ich habe kürzlich eine viel einfachere Methode gefunden, um den Zeitraum zwischen zwei Klicks auf die Schaltfläche ZURÜCK aufzuzeichnen und zu vergleichen. Beispielcode wie folgt:
Dies reicht aus, um die Anwendung durch zweimaliges Klicken auf die Schaltfläche ZURÜCK innerhalb einer bestimmten Verzögerungszeit zu beenden, die im Beispiel 2000 Millisekunden beträgt.
quelle
Die akzeptierte Antwort ist die beste, aber wenn Sie sie verwenden
Android Design Support Library
, können Sie sieSnackBar
für bessere Ansichten verwenden.quelle
Es ist keine eingebaute Funktionalität. Ich denke, es ist nicht einmal das empfohlene Verhalten. Android-Apps sollen nicht beendet werden:
Warum bieten Android-Anwendungen keine "Beenden" -Option?
quelle
Erstellen Sie abschließend eine onBackPressedMethod wie folgt:
Das funktioniert richtig, ich habe getestet. und ich denke das ist viel einfacher.
quelle
Zefnus 'Antwort mit System.currentTimeMillis () ist die beste (+1). Die Art und Weise, wie ich es gemacht habe, ist nicht besser als das, aber ich poste es trotzdem, um die obigen Ideen zu ergänzen.
Wenn der Toast beim Drücken der Zurück-Taste nicht sichtbar ist, wird der Toast angezeigt. Wenn er sichtbar ist (der Rücken wurde bereits beim letzten
Toast.LENGTH_SHORT
Mal einmal gedrückt ), wird er beendet.quelle
Vor kurzem musste ich diese Funktion für die Zurück-Schaltfläche in einer meiner Apps implementieren. Die Antworten auf die ursprüngliche Frage waren nützlich, aber ich musste zwei weitere Punkte berücksichtigen:
Basierend auf den Antworten und Kommentaren habe ich den folgenden Code erstellt:
Der obige Code setzt voraus, dass die Support-Bibliothek verwendet wird. Wenn Sie Fragmente verwenden , aber nicht die Unterstützung Bibliothek, möchten Sie ersetzen
getSupportFragmentManager()
durchgetFragmentManager()
.Entfernen Sie die erste
if
, wenn die Zurück-Taste nie abgebrochen wird. Entfernen Sie die zweiteif
, wenn Sie keine Fragmente oder einen Fragment-Back-Stack verwendenEs ist auch wichtig zu wissen, dass die Methode
onBackPressed
seit Android 2.0 unterstützt wird. Auf dieser Seite finden Sie eine ausführliche Beschreibung. Fügen Sie Ihrer Aktivität die folgende Methode hinzu, damit die Funktion zum Zurückdrücken auch bei älteren Versionen funktioniert:quelle
In Java
In Kotlin
quelle
Ich weiß, dass dies eine sehr alte Frage ist, aber dies ist der einfachste Weg, um das zu tun, was Sie wollen.
Ich weiß, dass dies nicht die beste Methode ist, aber es funktioniert gut!
quelle
Zu diesem Zweck habe ich folgende Funktion implementiert:
quelle
Dies ist auch hilfreich, wenn Sie zuvor Stapelaktivitäten im Stapel gespeichert haben.
Ich habe Sudheeshs Antwort geändert
quelle
quelle
Eine etwas bessere Methode als Zefnus, denke ich. Rufen Sie System.currentTimeMillis () nur einmal auf und lassen Sie Folgendes weg
return;
:quelle
Hier ist der vollständige Arbeitscode. Vergessen Sie auch nicht, die Rückrufe zu entfernen, damit in der App kein Speicherverlust auftritt. :) :)
quelle
Hier habe ich verallgemeinert den Code für N Tap Count geschrieben. Der Code ist ähnlich für die Option Entwickler aktivieren in Android-Gerät Telefon geschrieben. Sogar Sie können dies verwenden, um Funktionen zu aktivieren, während Entwickler die App testen.
Rufen Sie askToExit () beim Zurückdrücken oder Abmelden auf.
quelle
ich benutze das
Verwenden Sie im Ereignis
onBackPressed
oder
ExitApp.now(this,R.string.double_back_pressed)
Für Änderungssekunden sind geschlossene, angegebene Millisekunden erforderlich
ExitApp.now(this,R.string.double_back_pressed,5000)
quelle
Wenn HomeActivity eine Navigationsleiste und eine doppelte backPressed () -Funktion enthält, um die App zu beenden. (Vergessen Sie nicht, die globale Variable boolean doubleBackToExitPressedOnce = false zu initialisieren.) Neuer Handler nach 2 Sekunden setzen Sie die Variable doubleBackPressedOnce auf false
quelle
quelle
Einige Verbesserungen in der Antwort von Sudheesh B Nair, ich habe bemerkt, dass es auf den Handler wartet, auch wenn es zweimal zweimal zurückgedrückt wird. Brechen Sie den Handler also ab, wie unten gezeigt. Ich habe Toast auch abgebrochen, um zu verhindern, dass er nach dem Beenden der App angezeigt wird.
quelle
Dies ist das Gleiche wie die akzeptierte und am meisten gewählte Antwort, aber diese abgeschnittene Snackbar wurde anstelle von Toast verwendet.
quelle
In meinem Fall bin ich
Snackbar#isShown()
zum Besseren darauf angewiesenUX
.quelle
Verwenden Sie für die Aktivität mit Navigationsleiste den folgenden Code für OnBackPressed ()
quelle
Hier ist ein anderer Weg ... mit der CountDownTimer- Methode
quelle