Meine Anwendung verfügt über die folgenden Ablaufbildschirme:
Home->screen 1->screen 2->screen 3->screen 4->screen 5
Jetzt habe ich log out
in jedem Bildschirm eine gemeinsame Schaltfläche
( Home/ screen 1 / screen 2 /screen 3/ screen 4 / screen 5
)
Ich möchte, dass, wenn der Benutzer auf die Schaltfläche zum Abmelden klickt (von einem beliebigen Bildschirm aus), alle Bildschirme beendet werden und ein neuer Bildschirm Log in
geöffnet wird.
Ich habe fast alle versucht FLAG_ACTIVITY
, dies zu erreichen. Ich gehe auch einige Antworten im Stackoverflow durch, kann das Problem aber nicht lösen. Meine Anwendung ist auf Android 1.6, kann also nicht verwendet werdenFLAG_ACTIVITY_CLEAR_TASK
Gibt es eine Möglichkeit, das Problem zu lösen?
Antworten:
Verwenden:
Dadurch werden alle Aktivitäten über dem Haus gelöscht.
Angenommen, Sie beenden den Anmeldebildschirm, wenn sich der Benutzer anmeldet und die Startseite erstellt wird, und anschließend alle Bildschirme von 1 bis 5 darüber. Der Code, den ich gepostet habe, bringt Sie zum Startbildschirm zurück und beendet alle anderen Aktivitäten. Sie können der Absicht ein zusätzliches hinzufügen und dies in der Startbildschirmaktivität lesen und auch beenden (möglicherweise den Anmeldebildschirm von dort aus erneut starten oder so).
Ich bin mir nicht sicher, aber Sie können auch versuchen, sich mit dieser Flagge anzumelden. Ich weiß nicht, wie die Aktivitäten in diesem Fall bestellt werden. Sie wissen also nicht, ob die Bilder unter dem Bildschirm, auf dem Sie sich befinden, einschließlich des Bildschirms, auf dem Sie sich gerade befinden, gelöscht werden, aber es ist definitiv der richtige Weg.
Hoffe das hilft.
quelle
singleInstance
, sollten Sie sieFLAG_ACTIVITY_CLEAR_TOP|FLAG_ACTIVITY_SINGLE_TOP
als Flags für die Absicht verwenden. Dadurch werden die dazwischen liegenden Aktivitäten beendet und die gewünschte Aktivität gestartet (oder wieder in den Vordergrund gebracht).intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
zu meiner Aktivität hat mir nicht geholfen. Die dazwischen liegenden Aktivitäten wurden nicht beendet. Wenn ich auf dem Anmeldebildschirm zurückdrücke, werden die vorherigen Aktivitäten angezeigt. Hier ist mein CodeIntent intent=new Intent(BaseActivity.this, Login.class);intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);startActivity(intent);
.Sie können es versuchen
Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK
. Alle vorherigen Aktivitäten werden vollständig gelöscht und neue Aktivitäten gestartet.quelle
Fügen Sie vor dem Starten Ihrer neuen Aktivität einfach den folgenden Code hinzu:
Oder wenn Sie möchten, dass es in früheren Versionen von Android funktioniert:
quelle
Wenn der Benutzer alle geöffneten Aktivitäten beenden möchte , sollte er eine Schaltfläche drücken, die die erste Aktivität lädt, die beim Start Ihrer Anwendung ausgeführt wird, alle anderen Aktivitäten löschen und die letzte verbleibende Aktivität beenden. Lassen Sie den folgenden Code ausführen, wenn der Benutzer die Exit-Taste drückt. In meinem Fall
LoginActivity
ist dies die erste Aktivität in meinem Programm, die ausgeführt wird.Der obige Code löscht alle Aktivitäten außer
LoginActivity
. Fügen Sie dann den folgenden Code in dasLoginActivity
's einonCreate(...)
, um zu warten, wannLoginActivity
neu erstellt und das' EXIT'-Signal übergeben wurde:Warum ist es so schwierig, eine Exit-Schaltfläche in Android zu erstellen?
Android ist bemüht, Sie davon abzuhalten, eine Schaltfläche zum Beenden in Ihrer Anwendung zu verwenden, da der Benutzer sich nie darum kümmern soll, ob die von ihm verwendeten Programme im Hintergrund ausgeführt werden oder nicht.
Die Entwickler von Android-Betriebssystemen möchten, dass Ihr Programm ein unerwartetes Herunterfahren und Ausschalten des Telefons übersteht. Wenn der Benutzer das Programm neu startet, wird es genau dort fortgesetzt, wo es aufgehört hat. So kann der Benutzer einen Anruf erhalten, während er Ihre Anwendung verwendet, und Karten öffnen, für die Ihre Anwendung für mehr Ressourcen freigegeben werden muss.
Wenn der Benutzer Ihre Anwendung wieder aufnimmt, wird er ohne Unterbrechung genau dort fortgesetzt, wo er aufgehört hat. Diese Exit-Schaltfläche beansprucht die Stromversorgung des Aktivitätsmanagers und verursacht möglicherweise Probleme mit dem automatisch verwalteten Lebenszyklus des Android-Programms.
quelle
Dies funktioniert für alle Android-Versionen. Wo
IntentCompat
die Klasse in der Android Support-Bibliothek hinzugefügt wurde.quelle
IntentCompat.FLAG_ACTIVITY_CLEAR_TASK
wird nicht erkannt, verwendenIntent
stattIntentCompat
.Verwenden Sie Folgendes für Aktivitäten
Entfernen Sie das CLEAR_TASK-Flag für die Fragmentverwendung.
Ich hoffe, dass dies für einige Leute nützlich sein kann.
quelle
Ich glaube, ich bin spät dran, aber es gibt eine einfache und kurze Antwort. In Activity gibt es eine finishAffinity () -Methode, mit der die aktuelle Aktivität und alle übergeordneten Aktivitäten beendet werden. Sie funktioniert jedoch nur in Android 4.1 oder höher.
Verwenden Sie für API 16+
finishAffinity();
Für unter 16 verwenden
ActivityCompat.finishAffinity(YourActivity.this);
Ich hoffe es hilft!
quelle
Von developer.android.com :
Beenden Sie diese Aktivität sowie alle Aktivitäten direkt darunter in der aktuellen Aufgabe, die dieselbe Affinität haben. Dies wird normalerweise verwendet, wenn eine Anwendung für eine andere Aufgabe gestartet werden kann (z. B. von einer ACTION_VIEW eines Inhaltstyps, den sie versteht) und der Benutzer die Aufwärtsnavigation verwendet hat, um von der aktuellen Aufgabe zu einer eigenen Aufgabe zu wechseln. Wenn der Benutzer in diesem Fall zu anderen Aktivitäten der zweiten Anwendung navigiert ist, sollten alle diese Aktivitäten im Rahmen des Aufgabenwechsels aus der ursprünglichen Aufgabe entfernt werden.
Beachten Sie, dass Sie mit diesem Finish keine Ergebnisse für die vorherige Aktivität liefern können. Wenn Sie dies versuchen, wird eine Ausnahme ausgelöst.
quelle
Nebenbei bemerkt, gut zu wissen
Diese Antwort funktioniert ( https://stackoverflow.com/a/13468685/7034327 )
während das nicht funktioniert
.setFlags()
Ersetzt alle vorherigen Flags und fügt währenddessen keine neuen Flags hinzu.addFlags()
.Das wird also auch funktionieren
quelle
Wenn Ihre Anwendung mindestens SDK-Version 16 hat, können Sie finishAffinity () verwenden.
Beenden Sie diese Aktivität sowie alle Aktivitäten direkt darunter in der aktuellen Aufgabe, die dieselbe Affinität haben.
Dies ist Arbeit für mich. Im Bildschirm "Top Payment" entfernen Sie alle Backstack-Aktivitäten.
http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29
quelle
Eine Lösung, die ich dafür implementiert habe (ich glaube, ich habe sie irgendwo bei Stack Overflow gefunden, aber ich erinnere mich nicht, also danke an denjenigen, der das überhaupt getan hat):
Führen Sie bei jeder Ihrer Aktivitäten Folgendes aus:
Überschreiben Sie dann in Ihrer LoginActivity onKeyDown:
quelle
Verwenden Sie für die Abmeldeschaltfläche auf dem letzten Bildschirm der App diesen Code im Listener der Abmeldeschaltfläche, um alle geöffneten vorherigen Aktivitäten abzuschließen, und Ihr Problem ist behoben.
quelle
quelle
setFlags
ersetzt alle vorherigen, so dass zuletztsetFlags
nur gültig ist, vorherige ersetzt werden. Sie müssen also nicht anrufeni1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
Ich habe das gleiche Problem, das Sie verwenden können
IntentCompat
, wie folgt:Dieser Code funktioniert für mich.
Android API 17
quelle
In meinem Fall verwende ich die
finishAffinity()
Funktion in der letzten Aktivität wie:Hoffe es wird nützlich sein.
quelle
anstatt
finish()
nur zu verwendenfinishAffinity();
quelle
Anmelden> Start-> Bildschirm 1-> Bildschirm 2-> Bildschirm 3-> Bildschirm 4-> Bildschirm 5
auf Bildschirm 4 (oder einem anderen) ->
mitquelle
für API> = 15 bis API 23 einfache Lösung.
quelle
Wenn Sie
startActivityForResult()
in Ihren vorherigen Aktivitäten verwenden, überschreiben Sie einfachOnActivityResult()
die darin enthaltenefinish();
Methode und rufen Sie sie in allen Aktivitäten auf. Dies erledigt den Job ...quelle
startActivity
nur.onActivityResult
jede Aktivität aufrechtzuerhalten. Ich habe den Vorschlag von DArkO umgesetzt und mein Ziel erreicht und danke für die Hilfe.Wenn der Benutzer auf die Schaltfläche zum Abmelden klickt, schreiben Sie den folgenden Code:
Und auch wenn Sie nach der Anmeldung eine neue Aktivität aufrufen, verwenden Sie nicht finish ().
quelle
Einfach, wenn Sie den Anmeldebildschirm verlassen, nicht, wenn Sie den Anmeldebildschirm beendet haben.
Verwenden Sie diese Option dann bei allen Weiterleitungsaktivitäten zum Abmelden:
Es funktioniert perfekt.
quelle
Wenn Sie sich beim Benutzer anmelden
screen 1
und von dort aus zu den anderen Bildschirmen wechseln, verwenden Siequelle
onKeyDown
undonBackPressed
(oderonKeyDown
, wenn Sie Android-Versionen <2.0 unterstützen möchten) in jeder Ihrer Aktivitäten (mit Ausnahme der Anmeldungsversion) überschreiben undstartActivity(login)
dort wie oben gezeigt.Ich habe diesen Weg gefunden, es wird die gesamte Geschichte löschen und beenden
quelle
Ich glaube, ich bin spät dran, aber es gibt eine einfache und kurze Antwort. In Activity gibt es eine finishAffinity () -Methode, mit der die aktuelle Aktivität und alle übergeordneten Aktivitäten beendet werden. Sie funktioniert jedoch nur in Android 4.1 oder höher.
Verwenden Sie für API 16+
finishAffinity ();
Für unter 16 verwenden
ActivityCompat.finishAffinity (YourActivity.this);
Ich hoffe es hilft!
shareedit antwortete am 27. Mai 18 um 8:03 Uhr
Akshay Taru
quelle
Ich fand, dass diese Lösung trotz API-Level auf jedem Gerät funktioniert (sogar für <11).
quelle
Der beste Weg, um alle vorherigen Aktivitäten zu schließen und den Speicher zu löschen
quelle
quelle