Erklärung der Affinität zu Android-Aufgaben


104

Wofür genau wird das Attribut taskAffinityverwendet? Ich habe die Dokumentation durchgesehen , konnte aber nicht viel verstehen.

Kann jemand die Aufgabenaffinität mit Laien erklären?


1
Hier ist eine sehr gute Erklärung mit Beispielen: slidehare.net/RanNachmany/…
user1269737

Ich denke, diese Antwort ist am besten: stackoverflow.com/a/21383301/1318946
Pratik Butani

Antworten:


160

Wofür wird Android Task Affinity verwendet?

Eine Android-Anwendung verfügt über Aktivitäten, die einen Stapel wie ein Kartenspiel bilden. Wenn Sie eine Android-Anwendung starten und fünf Aktivitäten A, B, C, D, E starten. Sie bilden einen Stapel

E   - chat view
D   - weather screen
C   - map view
B   - weather screen
A   - login screen

E war die letzte Aktivität, die gestartet wurde, und sie wird angezeigt. Wenn Sie E schließen, wird D angezeigt. Wenn Sie D schließen, wird C angezeigt. etc.

Beachten Sie, dass Aktivitäten Bund Ddie gleiche Aktivität sind. Was wäre, wenn der Benutzer einige Änderungen an der vornehmen D weather screenund dann entscheiden würde, die Aktivität zu schließen und dann die zu schließen C Map view?

Dann wäre der Benutzer wieder auf dem Wetterbildschirm und der Benutzer wäre unglücklich, da die auf der Ebene vorgenommenen Änderungen D weather screennicht in der Ebene gespeichert wurden B weather screen. Obwohl es sich um dieselbe Aktivität handelt, handelt es sich um einen anderen ZUSTAND dieser Aktivität.

Der Benutzer hatte einen 5-Ebenen-Stapel von Aktivitäten, von denen zwei dieselbe Aktivität waren. Wenn Sie alle 5 vom Stapel nehmen, entsteht das Phänomen, dass Sie mit zwei verschiedenen Versionen derselben Aktivität interagieren, was sehr verwirrend sein kann.

Benutzer denken normalerweise nicht in einem starren Stapel von Aktivitäten. Sie denken: "Oh, die Wetteransicht, ich werde dort eine Änderung vornehmen" und dann wollen sie zur Kartenansicht zurückkehren. Sichern Sie dann erneut, da Sie zum Anmeldebildschirm zurückkehren möchten. Warum wird B weather appangezeigt und warum wurden die Einstellungen nicht vom Level Dgespeichert?

Der Programmierer kann möglicherweise Verwirrung stiften, wenn Aktivitäten Bund DStatus verknüpft sind. Auf diese Weise ändert sich zu einem das andere. Jedes Mal, wenn der Benutzer einen neuen Wetterbildschirm öffnet, öffnet er heimlich die einzelne Instanz des Wetterbildschirms.

Unter diesen Umständen kann es wünschenswert sein, die TaskAffinity der Aktivität zu ändern. Der Benutzer würde Stufe D ändern. Dann zurück zu Stufe B. Und die Änderungen in B sehen, die an D vorgenommen wurden.

Das Programm speichert einen Stapel, über den Sie sichern können, was sehr hilfreich ist. Wenn der Benutzer X Instanzen derselben Aktivität an zufälligen Stellen öffnet, sind sie alle eins.

Diashow mit weiteren Erklärungen: http://www.slideshare.net/RanNachmany/manipulating-android-tasks-and-back-stack


13
Wie wäre es, wenn Sie das singleInstanceanstelle des verwenden taskAffinity?
hguser

5
In dem oben beschriebenen Fall würde ich es vorziehen, Intent.FLAG_ACTIVITY_REORDER_TO_FRONT als Flag in der Absichtsaufrufaktivität D zu verwenden. Dies würde Aktivität B über alle anderen bringen und nur eine Instanz davon behalten
EyalBellisha

63
Eigentlich berührt diese Antwort kaum etwas taskAffinity:-( Die Erklärung ist vage. Erstaunlich, dass diese Antworten so viele positive Stimmen bekommen.
David Wasser

5
So lange Antwort, aber immer noch nicht erwähnt die einfache Tatsache: taskAffinitywird verwendet, um den Namen der Aufgabe anzugeben, in der die Aktivität bevorzugt ausgeführt wird. Wenn eine Intentdas Flag enthält FLAG_ACTIVITY_NEW_TASK, wird die Aktivität in diese bestimmte Aufgabe (definiert durch taskAffinity) eingefügt .
Stan Mots

2
Although it's the same activity, it's a different STATE of that activity.Ich würde sagen: "Es ist ein weiteres Beispiel für diese Aktivität."
Maksim Dmitriev

6

Die Affinität gibt an, zu welcher Aufgabe eine Aktivität bevorzugt gehört.

Die Affinität kommt unter zwei Umständen ins Spiel:

Wenn die Absicht, die eine Aktivität startet, das Flag FLAG_ACTIVITY_NEW_TASK enthält.

Wenn für eine Aktivität das Attribut allowTaskReparenting auf "true" gesetzt ist.

Weitere Informationen finden Sie unter http://developer.android.com/guide/components/tasks-and-back-stack.html


26
Vielen Dank für das Kopieren von developer.android.com
Anirban

Das erklärt nichts. Was bedeutet das in der Praxis?
James Andrews

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.