Android SingleTask oder SingleInstance Startmodus? [geschlossen]

84

Ich habe eine App, deren Hauptaktivität eine Liste ist. Anschließend können Sie auf Elemente klicken, um eine detaillierte Ansicht dieses Elements zu erhalten. Ich habe auch eine Suchaktivität, die der Hauptaktivität ähnlich ist und wie beabsichtigt funktioniert.

Ich möchte jedoch, dass diese Suchaktivität nur eine Instanz auf dem Stapel hat, damit Benutzer mehrmals suchen können. Wenn Sie auf "Zurück" klicken, kehren Sie zur vorherigen Ansicht zurück, in der sie sich vor Beginn der Suche befanden (anstatt zu den vorherigen Suchergebnissen zurückzukehren).

Sowohl der SingleTask- als auch der SingelInstance-Startmodus scheinen zu tun, was ich will. Ich bin mir nicht sicher, welchen ich für diesen Zweck verwenden soll und warum?

Kman
quelle

Antworten:

141

Auf der Seite " Anwendungsgrundlagen " des Android-Entwicklerhandbuchs:

Standardmäßig haben alle Aktivitäten in einer Anwendung eine Affinität zueinander - das heißt, es wird bevorzugt, dass sie alle zur selben Aufgabe gehören.

Eine "singleInstance" -Aktivität ist die einzige Aktivität in ihrer Aufgabe. Wenn eine andere Aktivität gestartet wird, wird diese Aktivität unabhängig von ihrem Startmodus in eine andere Aufgabe gestartet - als ob FLAG_ACTIVITY_NEW_TASK beabsichtigt wäre. Im Übrigen ist der Modus "singleInstance" identisch mit "singleTask".

Wie oben erwähnt, gibt es nie mehr als eine Instanz einer "singleTask" - oder "singleInstance" -Aktivität, sodass von dieser Instanz erwartet wird, dass sie alle neuen Absichten verarbeitet. Eine "singleInstance" -Aktivität befindet sich immer oben im Stapel (da dies die einzige Aktivität in der Aufgabe ist), sodass sie immer in der Lage ist, die Absicht zu verarbeiten. Eine "singleTask" -Aktivität kann jedoch andere Aktivitäten darüber im Stapel haben oder nicht. Wenn dies der Fall ist, ist es nicht in der Lage, die Absicht zu verarbeiten, und die Absicht wird gelöscht. (Obwohl die Absicht fallengelassen wurde, hätte ihre Ankunft dazu geführt, dass die Aufgabe in den Vordergrund getreten wäre, wo sie verbleiben würde.)

4 Aktivitäten in einer Aufgabe

Da es in beiden Startmodi nie mehr als eine Instanz der Aktivität gibt, gelangen Sie mit der Schaltfläche "Zurück" immer zur vorhandenen Instanz der Aktivität in Ihrem Fall.

Ein wichtiger Unterschied besteht darin, dass für "singleTask" keine neue Aufgabe für die neuen Aktivitäten erstellt werden muss, die gestartet werden, wenn etwas ausgewählt wird. Sie muss diese neue Aufgabe auch nicht jedes Mal auf der Zurück-Schaltfläche entfernen.

Da sich Ihr Aktivitätsstapel alle auf eine Benutzeraufgabe bezieht und es nicht so klingt, als hätten Sie eine komplizierte Intent-Struktur, in der singleInstance von Vorteil sein kann, um sie immer zu handhaben, würde ich die Verwendung des SingleTask-Startmodus empfehlen.

Hier ist ein guter Blog-Beitrag für weitere Informationen sowie eine Gutschrift für das Bild: Android-Aktivitäten und -Aufgaben - Eine Einführung in das UI-Komponentenmodell von Android

Guzba
quelle
4
Vielen Dank! sieht aus wie eine gute Lektüre ... die Sache ist iv erkannt, dass ich tatsächlich mehrere Instanzen einer Aktivität WOLLEN und nur wenn die Vordergrundaktivität eine Suchaktivität ist und eine andere Suche durchgeführt wird, sollte sie diese vorhandene Aktivität verwenden (wie die Funktionsweise des Marktes) dafür ist das singeTop genau das, wonach ich suche, aber trotzdem danke für die Hilfe =) danke
Kman
1
Hey danke. Dieser gut geschriebene Beitrag hat mir zur Not geholfen.
Icecreamman
Vielen Dank für die Details, insbesondere für diese (obwohl die Absicht fallengelassen wurde, hätte ihre Ankunft dazu geführt, dass die Aufgabe in den Vordergrund gerückt wäre, wo sie verbleiben würde.) , Was meine Verwirrung sofort beseitigt. Ich habe nur darüber nachgedacht, was passiert, wenn sich eine einzelne Aufgabenaktivität nicht oben im Stapel befindet, während ich trotzdem ohne Angabe dorthin navigieren möchte FLAG_ACTIVITY_CLEAR_TOP .
Neevek
30

Auf einfache Weise

singleTask:

Das System erstellt eine neue Aufgabe und instanziiert die Aktivität an der Wurzel der neuen Aufgabe. Wenn jedoch eine Instanz der Aktivität bereits in einer separaten Aufgabe vorhanden ist, leitet das System die Absicht durch einen Aufruf seiner onNewIntent()Methode an die vorhandene Instanz weiter , anstatt eine neue Instanz zu erstellen. Es kann immer nur one instancedie Aktivität vorhanden sein.

Hinweis: Obwohl die Aktivität in einer neuen Aufgabe gestartet wird, kehrt der Benutzer mit der Schaltfläche Zurück zur vorherigen Aktivität zurück.

singleInstance-

Gleich wie "singleTask", außer dass das System keine anderen Aktivitäten in die Task startet, die die Instanz enthält . Die Aktivität ist immer das einzige und einzige Mitglied ihrer Aufgabe; Alle von dieser gestarteten Aktivitäten werden in einer separaten Aufgabe geöffnet .

Tarun Varshney
quelle
4

singleTaskund singleInstanceAktivitäten können nur eine Aufgabe beginnen. Sie befinden sich immer an der Wurzel des Aktivitätsstapels. Darüber hinaus kann das Gerät jeweils nur eine Instanz der Aktivität enthalten - nur eine solche Aufgabe.
für mehr android: launchMode .

Rupesh Yadav
quelle
1
Der letzte Satz gilt für singleInstance, nicht für singleTask
Serdar Samancıoğlu
@SerdarS. Schätzen Sie Ihren Kommentar. Hinzufügen weiterer Informationen zu singleTask- Das System erstellt eine neue Aufgabe und instanziiert die Aktivität im Stammverzeichnis der neuen Aufgabe. Wenn jedoch eine Instanz der Aktivität bereits in einer separaten Aufgabe vorhanden ist, leitet das System die Absicht durch einen Aufruf seiner onNewIntent()Methode an die vorhandene Instanz weiter , anstatt eine neue Instanz zu erstellen. Es kann jeweils nur eine Instanz der Aktivität vorhanden sein. für mehr developer.android.com
Rupesh Yadav
Verstanden, dann habe ich mich geirrt. Entschuldige die Störung.
Serdar Samancıoğlu