Объяснение привязки задач Android


104

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

Может ли кто-нибудь объяснить сходство задач с точки зрения непрофессионала?


1
Вот очень хорошее объяснение с примерами: slideshare.net/RanNachmany/…
user1269737 07

Я думаю, что это лучший ответ: stackoverflow.com/a/21383301/1318946
Pratik Butani

Ответы:


161

Для чего используется привязка задач Android?

В приложении для Android есть действия, которые образуют стопку, как колода карт. Если вы запускаете приложение для Android и запускаете пять действий A, B, C, D, E. Они сформируют стопку

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

E было последним запущенным Activity, и он отображается. Если вы закроете E, отобразится D. Если вы закроете D, отобразится C. и т.п.

Обратите внимание, что Действия Bи D- это одно и то же действие. Что, если бы пользователь внес некоторые изменения в D weather screen, а затем решил закрыть действие, а затем закрытьC Map view ?

Тогда пользователь вернется к экрану погоды, и он будет недоволен, потому что изменения, сделанные на уровне, D weather screenне были сохранены на уровне B weather screen. Хотя это одно и то же действие, это другое СОСТОЯНИЕ этого действия.

У пользователя был пятиуровневый стек действий, и два из них были одинаковыми. Извлечение всех 5 из стека создаст явление, при котором вы будете взаимодействовать с двумя разными версиями одного и того же действия, и это может сбить с толку.

Пользователи обычно не думают о жестком стеке действий. Они думают: «Ой, погодный режим, я там поменяю», а затем хотят вернуться к просмотру карты. Затем сделайте резервную копию еще раз, потому что они хотят вернуться к экрану входа в систему. ПочемуB weather app отображается и почему не сохранились настройки с уровня D?

Программист может облегчить некоторую путаницу, если Действия BиD были связаны в состоянии. Таким образом, одно изменение меняет другое. Каждый раз, когда пользователь открывает новый экран погоды, он тайно открывает единственный экземпляр экрана погоды.

В этих обстоятельствах может оказаться желательным изменение taskAffinity Activity. Пользователь изменит уровень D. Затем вернется на уровень B. И увидит изменения в 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 в качестве флага в Intent, вызывающем Activity D, это поставит Activity B поверх всех остальных и сохранит только один его экземпляр
EyalBellisha

65
На самом деле, этот ответ taskAffinityвообще почти не затрагивает :-( Объяснение расплывчатое. Удивительно, что за эти ответы так много положительных голосов.
Дэвид Вассер

6
Столь длинный ответ, но все же не упоминается простой факт: taskAffinityиспользуется для указания имени задачи, в которой действие предпочитает запускаться. Когда объект Intentсодержит флаг FLAG_ACTIVITY_NEW_TASK, действие затем помещается в эту конкретную задачу (определенную taskAffinity).
Stan Mots

3
Although it's the same activity, it's a different STATE of that activity.Я бы сказал: «Это еще один пример той деятельности».
Максим Дмитриев

6

Родство указывает, к какой задаче предпочитает принадлежать деятельность.

Сходство проявляется в двух обстоятельствах:

Когда намерение, запускающее действие, содержит флаг FLAG_ACTIVITY_NEW_TASK.

Когда для действия атрибут allowTaskReparenting установлен в значение «true».

См. Http://developer.android.com/guide/components/tasks-and-back-stack.html.


27
Спасибо за копирование с
сайта

Это ничего не объясняет. Что это означает на практике?
Джеймс Эндрюс,

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.