2010-12-03 6 views
64

Ich habe mehrere Beiträge über die Verwendung dieses gelesen, aber muss etwas verpassen, wie es für mich nicht funktioniert. Meine Aktivität A hat launchmode = "singleTop" im Manifest. Es startet Aktivität B mit launchmode = "singleInstance". Aktivität B öffnet einen Browser und empfängt und beabsichtigt zurück, weshalb es singleInstance ist. Ich versuche, die Zurück-Schaltfläche zu überschreiben, sodass der Benutzer zurück zur Aktivität A gesendet wird, und kann dann Zurück drücken, um die Aktivität zu verlassen, anstatt wieder zu Aktivität B zurückzukehren.Wie verwenden Sie Intent.FLAG_ACTIVITY_CLEAR_TOP zum Löschen des Aktivitätsstapels?

// activity B 
@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR 
    && keyCode == KeyEvent.KEYCODE_BACK 
    && event.getRepeatCount() == 0) onBackPressed(); 
return super.onKeyDown(keyCode, event); 
} 
@Override 
public void onBackPressed() { 
startActivity(new Intent(this, UI.class) 
.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK)); 
return; 
} 

Nachdem aus dem Browser zurückkehrt, der Stapel ... A, B, Browser, B

ich diesen Code ist also zu erwarten, um den Stapel zu ändern ... A ... Ein erneutes Drücken bringt den Benutzer zurück zum Home-Bildschirm.

Stattdessen scheint es, den Stapel zu ändern ... A, B, Browser, B, A ... als ob diese Flags nicht da sind.

Ich habe versucht, beenden() in Aktivität B nach StartActivity, aber dann die Schaltfläche zurück bringt mich zurück zum Browser wieder!

Was fehlt mir? Vielen Dank!

Antwort

55

@bitestar hat die richtige Lösung, aber es ist ein weiterer Schritt:

Es wurde in den docs versteckt, jedoch müssen Sie ändern die launchMode der Activity zu etwas anderem als standard. Andernfalls wird es zerstört und neu erstellt, anstatt an die Spitze zurückgesetzt zu werden.

+38

Eigentlich ... 'Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP' wird tun –

+0

Überprüfen Sie Steel_fedex Lösung für sein Beispiel. – Darpan

1

FLAG_ACTIVITY_NEW_TASK ist das Problem hier, das eine neue Aufgabe initiiert. Entfernen Sie es einfach & Sie sind fertig.

Nun empfehle ich Ihnen zu lesen, was mit ihnen

lesen this & Intent Flags here

+1

ich die Fahne gelesen hat, und es klang wie das, was ich brauchte. Unabhängig davon hat das Entfernen von FLAG_ACTIVITY_NEW_TASK keine Auswirkungen auf das Ergebnis. Es ist immer noch eine endlose Zurück-Taste Schleife ... A-> B, zurück zu A, zurück zu B, zurück zu A ... – piusvelte

+0

Sind Sie sicher, warum Sie B als singleInstance verwenden? AA "singleInstance" Aktivität verhält sich als ob FLAG_ACTIVITY_NEW_TASK war in der Absicht.Überprüfen Sie http://developer.android.com/guide/topics/fundamentals.html – 100rabh

+0

B muss die Absicht erhalten, zurückgerufen vom Browser. Ich habe versucht, den Launchmode zu SingleTask zu ändern, und das funktioniert immer noch, aber die Looping-Schleife auf der Rückseite kommt immer noch vor. – piusvelte

1

Zunächst arbeite ich hatte Problem FLAG_ACTIVITY_CLEAR_TOP immer auch jede Flagge tut vor der Arbeit. Schließlich habe ich es mit dem Wert davon (0x04000000) zu arbeiten. Es sieht also so aus, als gäbe es ein Eclipse/Compiler-Problem. Aber leider wird die überlebende Aktivität neu gestartet, was ich nicht will. Sieht so aus als ob es keine einfache Lösung gibt.

98

Ich habe die Aktivität A-> B-> C-> D gestartet. Wenn die Zurück-Taste auf Aktivität DI gedrückt wird, möchte ich zu Aktivität A gehen. Da A mein Ausgangspunkt ist und daher bereits auf dem Stapel alle Aktivitäten oben in A ist, können Sie nicht zu einer anderen Aktivität zurückkehren A.

das funktioniert tatsächlich in meinem Code:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     Intent a = new Intent(this,A.class); 
     a.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(a); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
}  
+0

Diese Lösung schließt alle zwischengeschalteten Aktivitäten, aber auch das Neustarten der RootActivity.Sie können @ Steel_Fedex's Lösung unten überprüfen tut das gleich, aber startet RootActivity nicht neu – Darpan

+0

Dies ist die beste Lösung für meinen Fall Ich möchte eigentlich die Root-Aktivität wieder starten –

18

Dazu verwende ich FLAG_ACTIVITY_CLEAR_TOP Flagge für Intent
(ohne FLAG_ACTIVITY_NEW_TASK) Start für startete Aktivität

und launchMode = "singleTask" in manifestieren.

Scheint wie es funktioniert, wie ich brauche - Aktivität startet nicht neu und alle anderen Aktivitäten sind geschlossen.

+0

Ich überprüft, Lösung von Bitster funktioniert nicht. Während diese Lösung funktionierte. RootActivity wurde nicht neu gestartet. – Darpan

+0

Wählen Sie Ihre Wörter weise.Bitestar Lösung funktioniert tatsächlich! – bitestar

+0

singleTask funktioniert für mich , so wird Aktivität nicht neu erstellen und Ereignis in onNewIntent behandeln. –

2

Ich weiß, dass es bereits eine akzeptierte Antwort gibt, aber ich sehe nicht, wie es für das OP funktioniert, weil ich glaube nicht, dass FLAG_ACTIVITY_CLEAR_TOP in seinem speziellen Fall sinnvoll ist. Diese Flagge ist nur relevant für Aktivitäten in der gleichen Aufgabe. Basierend auf seiner Beschreibung, ist jede Aktivität in einer eigenen Aufgabe: A, B und der Browser.

Etwas, das ihn vielleicht wegwirft, ist, dass A singleTop ist, wenn es singleTask sein sollte. Wenn A singleTop ist und B A startet, wird ein neues A erstellt, weil A nicht in Bs Aufgabe ist. Aus der Dokumentation für singleTop:

„Wenn eine Instanz der Aktivität bereits an der Spitze der aktuellen Aufgabe besteht, leitet das System der Absicht zu dieser Instanz ...“

Seit B beginnt A, Die aktuelle Aufgabe ist die Aufgabe von B, die für eine singleInstance gilt und daher A nicht enthalten kann. Verwenden Sie singleTask, um das gewünschte Ergebnis dort zu erzielen, da das System dann die Aufgabe mit A finden und diese Aufgabe in den Vordergrund bringen wird.

Schließlich, nachdem B A gestartet hat und der Benutzer von A zurück drückt, möchte das OP entweder B oder den Browser nicht sehen. Um dies zu erreichen, ist der Aufruf von finish() in B korrekt; FLAG_ACTIVITY_CLEAR_TOP wird die anderen Aktivitäten in der Aufgabe von A nicht entfernen, da sich seine anderen Aktivitäten alle in verschiedenen Aufgaben befinden. Das Stück, das er vermisste, ist, dass B auch FLAG_ACTIVITY_NO_HISTORY verwenden sollte, wenn er die Absicht für den Browser auslöst. Hinweis: Wenn der Browser bereits läuft, bevor Sie die Anwendung des OPs starten, wird der Browser natürlich angezeigt, wenn Sie von A zurück drücken. Um dies wirklich zu testen, müssen Sie vor dem Starten der Anwendung den Browser verlassen .

9

Obwohl diese Frage bereits ausreichend Antworten hat, dachte ich, jemand wissen möchte, warum diese Flagge Werke in dieser eigentümlichen Art und Weise, Das ist, was ich in Android documentation gefunden

Die derzeit laufende Instanz Aktivität B in dem Obiges Beispiel erhält entweder die neue Absicht, die Sie hier starten, in seiner onNewIntent() -Methode, oder Sie sind selbst fertig und starten mit der neuen Absicht neu.

Wenn der Startmodus auf "multiple" (Standard) festgelegt wurde und Sie FLAG_ACTIVITY_SINGLE_TOP nicht in derselben Absicht festgelegt haben, wird er beendet und neu erstellt. Für alle anderen Startmodi oder wenn FLAG_ACTIVITY_SINGLE_TOP gesetzt ist, wird diese Absicht an onNewIntent() der aktuellen Instanz übergeben.


So Entweder
. Ändern Sie die launchMode der Aktivität A in etwas anderes als Standard (dh singleTask oder etwas). Dann FLAG_ACTIVITY_CLEAR_TOP Ihre Fahne wird nicht starten Sie Ihre Aktivität A.

oder

. Verwenden Sie Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP als Ihre Flagge. Dann wird es so funktionieren, wie Sie es wünschen.

0

Ich rief activity_name.this.finish() nach dem Starten neuer Absicht und es funktionierte für mich.

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK" 

Aber es wird nicht für mich arbeiten ...Ich schlage nicht diese Lösung für den Einsatz, aber wenn Einstellung Flag wird nicht für Sie arbeiten, als Sie dies versuchen können.Aber ich empfehle es noch nicht

0

Hinzufügen Android: noHistory = "True" in Manifest-Datei.

<manifest > 
     <activity 
      android:name="UI" 
      android:noHistory="true"/> 

</manifest> 
1

Ich benutze drei Flags, das Problem zu beheben:

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| 
       Intent.FLAG_ACTIVITY_CLEAR_TASK | 
       Intent.FLAG_ACTIVITY_NEW_TASK); 
Verwandte Themen