Ich habe die Google Android Developer-Seite gelesen, aber das Konzept der Aufgabe ( Ссылка ) verwirre mich wirklich.
Nachdem ich bis SingleTask und SingleInstance gelesen habe, bin ich mehr verwirrt.
Ich möchte einige Fragen anhand von Beispielen stellen, hoffe, dass ich diese Fragen besser verstehen werde:
Nehmen wir an, ich habe zwei Anwendungen A und B, A hat x, y, z Aktivitäten; B hat 1, 2, 3 Aktivitäten:
Angenommen, ihr Startmodus ist Standard (Kein Absichtsflag verwenden). Und x ist Hauptaktivität von App A; 1 ist Hauptaktivität von App B.
1) Starten Sie App A, dann x- & gt; y - & gt; 1, drücken Sie die Home-Taste, starten Sie App A erneut, wir sehen Aktivität y oder 1?
2) Starten Sie App A, dann x - & gt; 1 - & gt; y - & gt; 2 - & gt; z - & gt; 3, drücken Sie die Home-Taste, starten Sie App A, es enthält alle Aktivitäten (x - & gt; 1 - & gt; y - & gt; 2 - & gt; z - & gt; 3), oder es enthält x - & gt; y - & gt; nur z? Wie wäre es, wenn wir App B jetzt starten? Welche Aktivitäten wird App B enthalten?
Sagen wir nun, die Aktivitäten 1, 2, 3 sind SingleTask; x, y, z immer noch Standard :
3) Starten Sie App A, dann x - & gt; y - & gt; 1 - & gt; 2, drücken Sie die Home-Taste, starten Sie App A, wird es enthalten X - & gt; nur y oder es enthält x - & gt; y - & gt; 1 - & gt; 2? Wie wäre es, wenn wir App B jetzt starten? App B enthält nur 1 oder 1 - & gt; 2?
4) Starten Sie App B, dann 1 - & gt; 2 - & gt; 3 - & gt; 1, werden 2 und 3 zerstört?
5) Starten Sie App B, dann 1 - & gt; 2 - & gt; 3, drücken Sie die Home-Taste, starten Sie App A jetzt, dann x - & gt; y - & gt; 2, dann drücken Sie die Zurück-Taste, um 2 zu löschen. Starten Sie jetzt App B, welche Aktivitäten es enthält? 1 - & gt; 3 nur oder 1 - & gt; 2 - & gt; 3?
Danke jemand Antwort und Hilfe!
Angenommen, ihr Startmodus ist Standard (Keine Absicht verwenden Flagge). Und x ist Hauptaktivität von App A; 1 ist Hauptaktivität von App B.
1) Starten Sie App A, dann x- & gt; y - & gt; 1, drücken Sie die Home-Taste, starten Sie die App A wieder, wir werden Aktivität y oder 1 sehen?
Sie werden die Aktivität 1
sehen. Sie haben eine einzelne Aufgabe, die x->y->1
mit der Aktivität 1
am Anfang des Aktivitätsstapels in dieser Aufgabe enthält. Wenn Sie auf STARTSEITE drücken, wird diese Aufgabe in den Hintergrund verschoben. Wenn Sie die App erneut starten, findet Android den Aufgabenstapel und bringt ihn (unversehrt) zurück in den Vordergrund und zeigt Ihnen die oberste Aktivität auf dem Stapel an (in diesem Fall 1
).
2) Starten Sie App A, dann x - & gt; 1 - & gt; y - & gt; 2 - & gt; z - & gt; 3, drücken Sie die Home-Taste, Starten von App A, es enthält alle Aktivitäten (x - & gt; 1 - & gt; y - & gt; 2 - & gt; z - & gt; 3), oder es enthält x - & gt; y - & gt; nur z?
Wie oben haben Sie eine einzelne Aufgabe. Wenn Sie auf STARTSEITE drücken, enthält die Aufgabe x->1->y->2->z->3
und wird in den Hintergrund verschoben. Wenn Sie App A erneut starten, wird die Aufgabe vorgezogen (intakt) und Sie sehen oben die Aktivität 3
.
Wie wäre es, wenn wir App B starten? jetzt? Welche Aktivitäten wird App B enthalten?
Nun, die Frage als solche ist nicht richtig. Was Sie wirklich wissen möchten, ist "Welche Aktivitäten wird diese Aufgabe enthalten?", Aber hier ist die Antwort:
Wenn Sie App B vom Startbildschirm aus starten, starten Sie eine neue Aufgabe. Diese Aufgabe enthält eine einzelne Aktivität, nämlich 1
. Diese Aufgabe hat nichts mit der anderen Aufgabe zu tun (die immer noch im Hintergrund ist). Die Tatsache, dass die Hintergrundaufgabe Aktivitäten aus zwei verschiedenen Anwendungen enthält, ist irrelevant.
Sagen wir nun, die Aktivitäten 1, 2, 3 sind SingleTask; x, y, z immer noch Standard:
3) Starten Sie App A, dann x - & gt; y - & gt; 1 - & gt; 2, drücken Sie die Home-Taste, starten Sie die App A, es enthält x - & gt; nur y oder es enthält x - & gt; y - & gt; 1 - & gt; 2?
An der Stelle, an der die Aktivität y
die Aktivität 1
startet, wird eine neue Aufgabe erstellt. Sie haben also eine Aufgabe mit der Aktivität x->y
und eine zweite Aufgabe, die 1
enthält. Wenn die Aktivität 1
die Aktivität 2
startet, hängt das von mehr als nur launchMode
der Aktivitäten ab. Selbst wenn die Aktivität 2
zu launchMode="singleTask"
deklariert wird, wenn taskAffinity
der Aktivität 2
mit der taskAffinity
der Aktivität 1
identisch ist (was standardmäßig der Fall ist, wenn sie zu derselben gehören) Anwendung) dann wird die Aktivität 2
in derselben Task wie die Aktivität 1
erstellt (dh: sie verhält sich so, als ob die Aktivität 2
% launchMode="standard"
hätte). Wenn jedoch die Aktivität 1
und die Aktivität 2
unterschiedliche taskAffinity
aufweisen, wird die Aktivität 2
als Root-Aktivität in einer neuen Aufgabe gestartet. Jetzt haben Sie 3 Aufgaben, so: Task1 enthält x->y
, Task2 enthält 1
und Task3 enthält 2
.
Wie wäre es, wenn wir App B jetzt starten? App B enthält nur 1 oder 1 - & gt; 2?
Wie oben, hängt dies von taskAffinity
ab. Wenn die taskAffinity
der Aktivität 1
und 2
identisch sind, bringt das Starten von App B vom HOME-Bildschirm die Aufgabe, die 1->2
enthält, in den Vordergrund. Wenn die taskAffinity
der Aktivitäten unterschiedlich sind, bringt das Starten von App B vom HOME-Bildschirm den Task, der die Aktivität 1
enthält, in den Vordergrund.
4) Starten Sie App B, dann 1 - & gt; 2 - & gt; 3 - & gt; 1, werden 2 und 3 zerstört?
Nein. 2
und 3
werden nicht zerstört.
Unter der Annahme, dass 1
, 2
und 3
alle launchMode="singleTask"
haben, hängt es (wieder) von den taskAffinity
-Einstellungen ab. Unter der Annahme, dass alle Aktivitäten dieselbe taskAffinity
haben, haben Sie eine einzelne Aufgabe mit 1->2->3->1
(Sie haben 2 Instanzen der Aktivität 1
), weil taskAffinity
trumps launchMode
.
Wenn alle Aktivitäten unterschiedliche taskAffinity
haben, dann haben Sie nach 1->2->3
3 separate Aufgaben, von denen jede eine einzelne Aktivität enthält. Wenn dann die Aktivität 3
die Aktivität 1
startet, bringt dies nur die Aufgabe mit der Aktivität 1
in den Vordergrund und erstellt keine neue Instanz der Aktivität 1
.
5) Starten Sie App B, dann 1 - & gt; 2 - & gt; 3, drücken Sie die Home-Taste, starten Sie App A jetzt, dann x - & gt; y - & gt; 2. Drücken Sie dann die Zurück-Taste, um die Option zu löschen. 2. Starten Sie App B jetzt, welche Aktivitäten es enthält? 1 - & gt; 3 nur oder 1 - & gt; 2 - & gt; 3?
Dies hängt wiederum von taskAffinity
ab. Wenn alle Aktivitäten von App B die gleiche taskAffinity
haben, dann haben Sie nach 1->2->3
eine Aufgabe. Benutzer drückt die HOME-Taste, diese Aufgabe wird in den Hintergrund gehen. Jetzt startet der Benutzer App A und erstellt eine neue Aufgabe. Nach x->y
enthält die zweite Aufgabe diese 2 Aktivitäten. Jetzt startet die Aktivität y
die Aktivität 2
.Da diese Aktivität launchMode="singleTask"
hat und eine andere taskAffinity
von den anderen Aktivitäten in der Aufgabe hat (sie haben alle taskAffinity
von App A), erstellt Android eine neue Aufgabe mit der Aktivität 2
als root. Android kann die vorhandene Aufgabe, die 1->2->3
enthält, nicht verwenden, da diese Aufgabe nicht die Aktivität 2
als Stamm enthält. Wenn der Benutzer ZURÜCK in 2
drückt, wird die Aktivität 2
beendet, wodurch die dritte Aufgabe beendet wird und der Benutzer zur zweiten Aufgabe zurückkehrt, die x->y
mit der Aktivität y
oben enthält. Wenn Sie nun auf STARTSEITE drücken und App B starten, wird die vorhandene erste Aufgabe, die 1->2->3
enthält, in den Vordergrund gebracht.
Wenn jedoch alle Aktivitäten von App B unterschiedliche taskAffinity
haben, haben Sie nach 1->2->3
3 separate Aufgaben, die jeweils eine einzelne Aktivität enthalten. Der Benutzer drückt auf STARTSEITE und startet App A, um eine neue Aufgabe zu erstellen (jetzt haben Sie 4 Aufgaben). Nach x->y
enthält die vierte Aufgabe diese 2 Aktivitäten. Jetzt startet die Aktivität y
die Aktivität 2
. Android bringt die Aufgabe, die die Aktivität 2
enthält, einfach in den Vordergrund. Der Benutzer drückt die BACK-Taste, wodurch die Aktivität 2
und die Aufgabe beendet werden (weil diese Aufgabe nun leer ist). Der Benutzer kehrt zur vorherigen Aufgabe zurück, die x->y
von App A enthält. Starten von App B von Der HOME-Bildschirm bringt einfach die Aufgabe mit der Aktivität 1
in den Vordergrund. Sie haben jetzt 3 Aufgaben: Aufgabe1 enthält die Aktivität 1
und ist im Vordergrund, Aufgabe2 enthält die Aktivität 3
und ist im Hintergrund, Aufgabe3 enthält x->y
und ist im Hintergrund.
HINWEISE
Ich verstehe, dass das kompliziert ist. Meine Antwort ist von meinem Kopf, ich habe nicht versucht, all diese Kombinationen zu implementieren und zu überprüfen (allerdings habe ich viele dieser Fälle in der Vergangenheit implementiert und ich weiß, wie es wirklich funktioniert). Der Grund dafür ist, dass das meiste von dem, was Sie beschrieben haben, in der realen Welt nicht gemacht wird, also sind die Beispiele nur theoretisch und nicht praktisch. Im echten Leben müssen Sie kaum die Startmodi singleTask
oder singleInstance
verwenden, es sei denn, Sie erstellen einen eigenen HOME-Bildschirmersatz oder Sie müssen genau steuern, wie sich Ihre Anwendung verhält, wenn sie von anderen Anwendungen gestartet wird In den meisten Fällen haben Sie nie mehr als eine Aktivität mit einem Startmodus von singleTask
oder singleInstance
.
Wenn Sie singleInstance
oder singleTask
verwenden, müssen Sie wissen, wie taskAffinity
funktioniert. Außerdem müssen Sie sicherstellen, dass Sie für jede Aktivität ein anderes App-Symbol (und wahrscheinlich auch eine App-Bezeichnung) haben deklariert als 'singleTask' oder 'singleInstance'. Ist dies nicht der Fall, kann der Benutzer nicht zur richtigen Aufgabe zurückkehren, da diese in der Liste der letzten Aufgaben angezeigt wird.
Tags und Links android android-activity launchmode