389 Stimmen

Durch zweimaliges Klicken auf die Zurück-Schaltfläche verlassen Sie eine Aktivität.

Ich habe in letzter Zeit dieses Muster in vielen Android-Apps und Spielen bemerkt: Beim Klicken auf die Zurück-Schaltfläche, um die Anwendung zu "beenden", erscheint eine Toast mit einer Nachricht ähnlich wie "Bitte klicken Sie erneut auf ZURÜCK, um zu beenden".

Ich frage mich, da ich es immer öfter sehe, ob das eine eingebaute Funktion ist, auf die man auf irgendeine Weise in einer Aktivität zugreifen kann. Ich habe den Quellcode vieler Klassen durchgesehen, konnte jedoch nichts darüber finden.

Natürlich kann ich mir ein paar Möglichkeiten vorstellen, um die gleiche Funktionalität recht einfach zu erreichen (das einfachste ist wahrscheinlich, einen Boolean in der Aktivität zu halten, der anzeigt, ob der Benutzer bereits einmal geklickt hat...), aber ich frage mich, ob es bereits etwas gibt.

BEARBEITEN: Wie @LAS_VEGAS erwähnt hat, meinte ich mit "beenden" nicht im traditionellen Sinne. (d.h. beendet) Ich meinte "zurück zu dem, was geöffnet war, bevor die Startaktivität der Anwendung gestartet wurde", wenn das Sinn macht :)

0 Stimmen

[Android - Bestätigung des App-Austritts mit Toast] [1]: stackoverflow.com/questions/14006461/…

1 Stimmen

Ich hatte das gleiche Problem beim Verwenden der HoloEverywhere-Bibliothek, zu einfach können Sie android:launchMode="singleTask" zur Aktivitätsdefinition in der Manifestdatei hinzufügen.

0 Stimmen

5voto

Ich weiß, dass dies eine sehr alte Frage ist, aber das ist der einfachste Weg, um zu tun, was du willst.

@Override
public void onBackPressed() {
   ++k; // initialisiere k, wenn du deine Aktivität zum ersten Mal startest.
   if(k==1){
      // mache das, was du beim ersten Klick tun möchtest, zum Beispiel:
      Toast.makeText(this, "Drücken Sie noch einmal die Zurück-Taste, um zu beenden", Toast.LENGTH_LONG).show();
   }else{
      // mache das, was du nach dem ersten Klick tun möchtest, zum Beispiel:
      finish(); 
   }
}

Ich weiß, dass dies nicht die beste Methode ist, aber sie funktioniert gut!

3 Stimmen

Dies ist nicht das allgemeine Verhalten des "Zweimaliges Klicken auf die Zurück-Schaltfläche zum Beenden". Wie der Kommentar von BruceHill in der akzeptierten Antwort zeigt, behandelt deine Antwort auch nicht das Zeitproblem.

0 Stimmen

Aber damit können Sie zurück klicken, es wird die Nachricht anzeigen, und dann können Sie etwas länger warten, wieder zurückgehen und die App wird geschlossen, und es wird das Verhalten der doppelten Back-Timing nicht behandeln

4voto

DannyRitiu Punkte 91

Normalerweise würde ich einen Kommentar hinzufügen, aber mein Ruf erlaubt das nicht. Also hier sind meine zwei Cent:

In Kotlin können Sie Coroutinen verwenden, um die Einstellung auf false zu verzögern:

private var doubleBackPressed = false
private var toast : Toast ?= null

override fun onCreate(savedInstanceState: Bundle?) {
    toast = Toast.makeText(this, "Drücken Sie erneut die Zurück-Taste, um zu beenden", Toast.LENGTH_SHORT)
}

override fun onBackPressed() {
    if (doubleBackPressed) {
        toast?.cancel()
        super.onBackPressed()
        return
    }
    this.doubleBackPressed = true
    toast?.show()
    GlobalScope.launch {
        delay(2000)
        doubleBackPressed = false
    }
}

Sie müssen importieren:

import kotlinx.coroutines.launch
import kotlinx.coroutines.delay
import kotlinx.coroutines.GlobalScope

0 Stimmen

Dies ist ein schöner Ansatz mit der Verwendung von Coroutinen, aber seit 2022 wurde super.onBackPressed veraltet. Daher erfordert diese Antwort eine Modifikation. Rufen Sie stattdessen finishActivity() auf, um zu beenden.

3voto

Bu Ti Punkte 31

Zu diesem Zweck habe ich die folgende Funktion implementiert:

private long onRecentBackPressedTime;
@Override
public void onBackPressed() {
    if (System.currentTimeMillis() - onRecentBackPressedTime > 2000) {
       onRecentBackPressedTime = System.currentTimeMillis();
       Toast.makeText(this, "Bitte drücken Sie erneut auf ZURÜCK, um zu beenden", Toast.LENGTH_SHORT).show();
       return;
     }
   super.onBackPressed();
}

3voto

Arpit Patel Punkte 9027

Dies hilft auch, wenn Sie vorherige Stapelaktivitäten im Stapel gespeichert haben.

Ich habe Sudheeshs Antwort modifiziert.

boolean doubleBackToExitPressedOnce = false;

@Override
public void onBackPressed() {
    if (doubleBackToExitPressedOnce) {
        //super.onBackPressed();

  Intent intent = new Intent(Intent.ACTION_MAIN);
                    intent.addCategory(Intent.CATEGORY_HOME);
                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//***Change Here***
                    startActivity(intent);
                    finish();
                    System.exit(0);
        return;
    }

    this.doubleBackToExitPressedOnce = true;
    Toast.makeText(this, "Bitte klicken Sie erneut auf ZURÜCK, um zu beenden", Toast.LENGTH_SHORT).show();

    new Handler().postDelayed(new Runnable() {

        @Override
        public void run() {
            doubleBackToExitPressedOnce=false;                       
        }
    }, 2000);
}

3voto

Suraj Vaishnav Punkte 6847

Ich denke, das ist das, was du brauchst, wenn wir diesen Toast zeigen wollen, wenn es nur eine Aktivität im Stapel gibt und der Benutzer auf "Zurück" drückt von dieser letzten Aktivität im Stapel.

var exitOpened=false // Globale Deklaration

und im onBackPressed Methode ändere es wie folgt:

override fun onBackPressed() {
        if (isTaskRoot && !exitOpened)
        {
            exitOpened=true
            toast("Bitte drücken Sie erneut auf Zurück, um zu beenden")
            return
        }
        super.onBackPressed()
    }

Hier wird isTaskRoot true zurückgeben, wenn die aktuelle Aktivität die Wurzelaktivität (erste Aktivität) des Stapels ist und false, wenn sie es nicht ist.

Sie können die offizielle Dokumentation hier überprüfen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X