Android: Aktivität öffnen, ohne im Stapel zu speichern

94

Ich habe 2 Aktivitäten: Main und List.

Von Main aus können Sie List öffnen. In der Liste können Sie Main öffnen.

Ich mag es so , dass jede Öffnung der Liste nicht nicht in die ‚Geschichte‘ gerettet werden. Wenn Sie also von Main zurück drücken, können Sie nicht zur Liste zurückkehren.

Ist es möglich?

Realtebo
quelle
11
Wenn 'list' 'main' startet, lassen Sie es finish()sofort danach aufrufen startActivity(...). Auf diese Weise gibt es nichts, zu dem Sie zurückkehren können, wenn der Benutzer von 'main' auf BACK drückt.
Squonk
Dies ist für die Benachrichtigungsnavigation, aber die Konzepte können anwendbar sein. developer.android.com/guide/topics/ui/notifiers/…
Kevin Lee

Antworten:

159

ActivitySetzen Sie beim Starten Ihrer Liste die IntentFlags wie folgt:

Intent i = new Intent(...); // Your list's Intent
i.setFlags(i.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); // Adds the FLAG_ACTIVITY_NO_HISTORY flag
startActivity(i);

Das FLAG_ACTIVITY_NO_HISTORYFlag verhindert, dass das Neue Activityzum Verlaufsstapel hinzugefügt wird.

NB: Wie @Sam hervorhebt, können Sie i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);stattdessen verwenden. Es gibt keinen funktionalen Unterschied.

Eric
quelle
2
Nur ein kleiner Kommentar zu dieser Methode: Diese Methode funktioniert perfekt, wenn nur 2 Aktivitäten vorhanden sind. Wenn die Listenaktivität jedoch in der Lage ist, eine andere Aktivität zu starten (beispielsweise die dritte Aktivität), kehrt ein Druck auf die Zurück-Schaltfläche in der dritten Aktivität zur Hauptaktivität und nicht zur
Listenaktivität zurück
Tatsächlich. Leider gibt es keine Möglichkeit, dies zu vermeiden. Es gibt kein IntentFlag, das besagt, dass "nur dann zur Geschichte hinzugefügt wird, wenn nicht zum ActivityUrsprung zurückgekehrt wird".
Eric
1
Nein, aber das FLAG_ACTIVITY_NEW_TASK-Flag erledigt den Job. Die Listenaktivität wird dem Verlauf hinzugefügt, jedoch immer oben. Bei einem
Zurückdrücken
6
Gibt es einen bestimmten Grund, setFlags()mit dem Sie getFlags()statt verwendet haben Intent.addFlags()?
Sam
1
@ PrinceFR es ist genau das was ich will! a -> b -> c und kehren Sie direkt zu c-
realtebo
89

Fügen Sie in der Manifestdatei Folgendes hinzu:

android:noHistory="true" 

zu der Aktivität, die Sie nicht auf dem Stapel behalten möchten.

Marcin S.
quelle
Gibt es einen Unterschied zum Starten der Aktivität mit dem Flag no_history?
Realtebo
1
Wie Sie in Ihrer Frage gesagt haben: "Jede Eröffnung der Liste wird NICHT in der 'Historie' gespeichert." Wenn Sie also Ihre Anwendung erneut öffnen, gelangen Sie zur Hauptaktivität
Marcin S.
@MarcinS. Wenn die App nicht in der Liste der letzten Apps enthalten ist, funktioniert sie nicht. Können Sie bitte erklären, warum dies geschieht
Ajit Kumar Dubey
1
Was ist der Unterschied zwischen diesen beiden Ansätzen (Manifest und Flag)?
Pumbosha
Der @ pumbosha Manifest-Ansatz lässt die Aktivität immer aus der Geschichte heraus. Mit dem Flag-Ansatz können Sie dieses Verhalten zur Laufzeit steuern.
John Crawford
27

Verwenden Sie die neue Aufgabe beim Löschen. Dies funktionierte in meinem Fall, als die anderen Optionen nicht funktionierten.

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

Löschen Sie den gesamten Verlaufsstapel und starten Sie eine neue Aktivität unter Android

Kalel Wade
quelle
1
Das wäre großartig, aber gibt es eine Möglichkeit, die umfassende Animation "Ändern der Aufgabe" des Systems zu stoppen? Das Hinzufügen von FLAG_ACTIVITY_NO_ANIMATION verhindert dies leider nicht!
AndroidGy
Dies wirkt sich auf die Anwendungsgeschwindigkeit aus.
Acauã Pitta
23

Wenn Sie bei Ihrer Aktivität direkt nach dem Öffnen eine andere aufrufen (), wird die abgeschlossene Aktivität vom Stapel entfernt.

beispielsweise:

Intent intent = new Intent(this, NextActivity.class);
startActivity(intent);
finish();
dac2009
quelle
Wenn Ihr Telefon nicht so schnell ist, sehen Sie, dass die vorherige Aktivität abläuft.
Nolan
@ Nolan, das ist nur, wenn Sie beenden, bevor Sie Aktivität beginnen
Henrik Bøgelund Lavstsen
7

In meinem speziellen Fall FLAG_ACTIVITY_NO_HISTORYhat nicht funktioniert. Weder hat FLAG_ACTIVITY_NEW_TASKnoch FLAG_ACTIVITY_CLEAR_TASKalleine gearbeitet.

Allerdings FLAG_ACTIVITY_NEW_TASKund FLAG_ACTIVITY_CLEAR_TASKzusammen hat funktioniert.

Intent intent = new Intent(FooActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
Fred
quelle
3

Ich wollte nur einen Weg hinzufügen, dies in Kotlin zu tun:

val i = Intent(this, LogInActivity::class.java)
startActivity(i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK))
Devin B.
quelle
2
Eher ein Kotlin-Weg: Intent(this, MainActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) }.also { startActivity(it) }
4ndro1d
3

Späte Antwort, fügt aber anderen Antworten etwas Tiefe hinzu. Es kommt darauf an, was mit anderen Aktivitäten geschehen soll, die von dieser Aktivität aus gestartet wurden

Option 1 - Nur diese eine Aktivität sollte keinen Verlauf der aufrufenden Aktivität haben

Dann machen Sie einfach:

Intent i = new Intent(...);
i.addFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

Option 2 - Alle Aktivitäten, die mit dieser bestimmten Aktivität gestartet wurden, sollten keinen Verlauf haben

Fügen Sie dann im Manifest der aufrufenden Aktivität hinzu:

android:noHistory="true" 

Wenn Sie jedoch einen Verlauf in einer neuen Aktivität haben möchten, müssen Sie das Flag manuell entfernen:

Intent i = new Intent(...);
i.removeFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

Hoffe das klärt andere Antworten auf :)

Miku
quelle
2

Versuchen Sie FLAG_ACTIVITY_CLEAR_TOP, wenn die Aktivität bereits ausgeführt wird:

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Live-Liebe
quelle
-4

Können Sie die Zurück-Schaltfläche für die jeweilige Aktivität nicht überschreiben, um die Rückgabefunktion zu stoppen?

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {

        return true;
    }
    return super.onKeyDown(keyCode, event);
}
Broak
quelle
6
Tu das nicht. Es ist akzeptabel, BACK für bestimmte Zwecke abzufangen, aber es Activityist nicht empfehlenswert, die BACK-Presse nur still zu verbrauchen und das Beenden eines zu verhindern .
Squonk
1
Stimme vollkommen zu ^ nur eine Option.
Broak
1
Dafür gibt OnBackPressedes.
Fred