Android Aufgabe und Prozess, SingleTask und SingleInstance

8

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!

    
GMsoF 04.09.2013, 10:37
quelle

1 Antwort

16
  

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.

    
David Wasser 04.09.2013, 19:25
quelle