Пояснення щодо спорідненості із завданням Android


104

Для чого саме використовується атрибут taskAffinity? Я переглянув документацію, але не міг багато чого зрозуміти.

Чи може хтось пояснити спорідненість задачі в лайманських термінах?


1
Ось дуже вдале пояснення з прикладами: slideshare.net/RanNachmany/…
користувач1269737

Я думаю , що ця відповідь краще: stackoverflow.com/a/21383301/1318946
Pratik Butani

Відповіді:


160

Для чого використовується Android Task Affinity?

У додатку для Android є діяльність, яка утворює стек, як колода карт. Якщо ви запустите додаток для android і розпочніть п'ять видів діяльності A, B, C, D, E. Вони сформують стопку

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

E була останньою діяльністю, яку розпочали, і вона показує. Якщо ви закриєте E, з'явиться D. Якщо закрити D, на дисплеї відобразиться C. тощо.

Повідомлення про те , що діяльність Bі Dті ж дії. Що робити, якщо користувач вніс деякі зміни в D weather screen, а потім вирішив закрити діяльність, а потім закрити C Map view?

Тоді користувач повернеться до екрана погоди, і користувач буде незадоволений, оскільки зміни, внесені на рівні D weather screen, не були збережені на рівні B weather screen. Хоча це та сама діяльність, це інший ДЕРЖАВ цієї діяльності.

Користувач мав 5-ти шаровий стек діяльності, і два з них були однаковими. Вискакування всіх 5 зі стека створить явище, коли ви будете взаємодіяти з двома різними версіями тієї самої діяльності та може бути дуже заплутаним.

Користувачі зазвичай не думають з точки зору жорсткого кола заходів. Вони думають: "о, вигляд погоди я внесу зміни", і тоді вони хочуть повернутися до перегляду карти. Потім знову створіть резервну копію, оскільки вони хочуть повернутися до екрана входу. Чому B weather appпоказ і чому він не врятував налаштування від рівня D?

Програміст, можливо, зміг би полегшити деяку плутанину, якщо Діяльність Bі Dбули пов'язані в штаті. Таким чином змінюється одна змінює іншу. Щоразу, коли користувач відкриває новий екран погоди, він таємно відкриває окремий екземпляр погоди.

У цих умовах може бути бажаним змінити завданняAffinity of Activity. Користувач змінив би рівень D. Потім поверніться до рівня В. І подивіться зміни B, які були внесені до D.

Програма зберігає стек, через який можна зробити резервну копію, що приємно, і коли користувач відкриває X випадків тієї самої діяльності у випадкових місцях, всі вони є одним.

Показ слайдів із додатковим поясненням: http://www.slideshare.net/RanNachmany/manipulating-android-tasks-and-back-stack


13
Як щодо того, якщо singleInstanceзамість цього використовувати taskAffinity?
hguser

5
У випадку, описаному вище, я вважаю за краще використовувати Intent.FLAG_ACTIVITY_REORDER_TO_FRONT як прапор у D активності виклику D, це призведе до активності B поверх усіх інших і збереже лише один її примірник
EyalBellisha

63
Насправді ця відповідь навряд чи стосується taskAffinity:-( Пояснення нечітке. Дивно, що відповіді на ці тез отримують так багато відгуків.
Девід Вассер

5
Тож довга відповідь, але все ще не згадує простий факт: taskAffinityвикористовується для вказівки назви завдання, в якому активність вважає за краще виконувати. Коли Intentмістить прапор FLAG_ACTIVITY_NEW_TASK, активність буде вставлена ​​в цю конкретну задачу (визначену taskAffinity).
Стен Моц

2
Although it's the same activity, it's a different STATE of that activity.Я б сказав: "Це ще один екземпляр цієї діяльності".
Максим Дмитрієв

6

Спорідненість вказує, якому завданню діяльність належить належати.

Спорідненість грає за двох обставин:

Коли намір, який запускає діяльність, містить прапор FLAG_ACTIVITY_NEW_TASK.

Якщо для активності атрибут enableTaskReparenting встановлено на "true".

Зверніться до http://developer.android.com/guide/components/tasks-and-back-stack.html


26
Дякуємо за копіювання з developer.android.com
Анірбан

Це нічого не пояснює. Що це означає на практиці?
Джеймс Ендрюс

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.