2016-03-20 29 views
1

Ich habe 4 Aktivitäten A, B, C, D, E mit jeweils als android:launchMode="singleInstance" deklariert und A ist parentActivity von B, und B ist übergeordnete Aktivität von C, in manifest.FLAG_ACTIVITY_CLEAR_TOP funktioniert nicht wie erwartet

Nun navigiert Anwender wie folgt E: A> B> C> D> E. Und ich habe eine Schaltfläche in E mit den folgenden OnClickListener

Intent intent = new Intent(E.this, C.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(intent); 

Was ich brauche? (auch nach der Dokumentation, wenn ich es richtig verstanden, das geschehen soll)

  • Aktivitäten D und E sollten aus dem Stapel gelöscht werden
  • Aktivität C sollte die Absicht Empfang wieder aufgenommen wird (wie SingleInstance gesetzt wird, wird nicht neu erstellt)

    Ich möchte diesen Stapel: C | B | Ein

Was ist los?

  • Aktivität C wird fortgesetzt Aufnahme der Absicht
  • Aktivitäten D und E sind NICHT vom Stapel gelöscht. Ich kann immer wieder auf die Schaltfläche klicken, um E, D, B, A zu sehen.

    Ich bekomme diesen Stapel: C | E | D | B | Ein

PS: Meine Frage ist sehr ähnlich this jedoch angesichts der Antworten gibt auf diese Frage nicht passt. Einige Antworten, die ich dort und woanders gefunden habe:

  1. Ich kann NEW_TASK Flag nicht verwenden, da ich A, B im Stapel am Leben halten muss.
  2. Ich kann nicht startActivityForResult() auf D und dann finish() es in der Tat ist ein Hack, wie ich andere entscheidende Faktoren in E wie die Bereitstellung der Absicht zu einer anderen Aktivität abhängig von Benutzereingaben.
  3. Ich kann nicht beenden() Aktivität D, während die Absicht zu E, und dann beenden Sie() E während schlagen C, die das Problem tatsächlich lösen würde. Aber, wenn zurück auf E gedrückt wird, möchte ich es zurück zu D und nicht C.
  4. Wenn ich versuche,() auf E, sobald ich startactivity(intent) nach dem Setzen von Flags, es endet nur E, aber nicht D.
+1

Können Sie versuchen, launchMode von 'singleInstance' in' singleTask' zu ändern? –

Antwort

1

Das Problem ist in android:launchMode="singleInstance". Nach den documentation für SingleInstance:

Wenn diese Aktivität eine neue Aktivität zu starten versucht, die neue Aktivität wird in einer eigenen Task gestartet werden.

Ihre Aktivität D wird also als neue Aufgabe gestartet und deshalb wird sie nicht gelöscht.

3

Artem Mostyaevs Kommentar löst das Rätsel! Verwenden singleTask

Was genau war der Fehler?

Wenn singleInstance als launchMode verwendet wird, und wenn eine Aktivität gestartet wird, macht Android sicher, dass es in eine neue Aufgabe gestartet wird, als ob NEW_TASK Flagge hinzugefügt wird, mit sich selbst in ihm die einzige Aktivität sein.

Also, wenn Benutzer zu E navigiert, war der Stapel nie wie [A | B | C | D | E] Stattdessen gab es fünf verschiedene Aufgaben wie [A] [B] [C] [D] [E].

Und als ich E> C mit CLEAR_TOP versuchte, suchte es tatsächlich nach C in seiner Aufgabe und versuchte, alle Aktivitäten nach C zu löschen. Aber C war nie in der Aufgabe, wo E residiert.

So versuchte es, eine neue Aktivität C zu starten, aber dann, wie ich launchMode auf singleInstance gesetzt hatte, hatte es keine andere Möglichkeit, als [C] nach vorne zu bringen, während andere Aufgaben unberührt blieben.

Wie also funktioniert singleTask?

Er schuf den Stapel wie ich wollte [A | B | C | D | E] und CLEAR_TOP funktionierten wie erwartet. Erledigt!

+1

Tolle Erklärung! Mehr besser als meins :) –

Verwandte Themen