Explicação de afinidade de tarefa Android

Respostas:

161

Para que é usado o Android Task Affinity?

Um aplicativo Android possui atividades que formam uma pilha como um baralho de cartas. Se você iniciar um aplicativo Android e iniciar cinco atividades A, B, C, D, E. Eles formarão uma pilha

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

E foi a última Activity a ser iniciada e está aparecendo. Se você fechar E, D será mostrado. Se você fechar D, C será mostrado. etc.

Observe que Atividades Be Dsão a mesma atividade. E se o usuário fizesse algumas modificações no D weather screen, e decidisse fechar a atividade e, em seguida, feche oC Map view ?

Então o usuário voltaria para a tela de previsão do tempo e ficaria infeliz porque as alterações feitas no nível D weather screennão foram salvas no nívelB weather screen . Embora seja a mesma atividade, é um ESTADO diferente dessa atividade.

O usuário tinha uma pilha de 5 camadas de atividades, e duas delas eram a mesma atividade. Tirar todos os 5 da pilha criará o fenômeno em que você estará interagindo com duas versões diferentes da mesma atividade e pode ser bastante confuso.

Os usuários geralmente não pensam em termos de uma pilha rígida de atividades. Eles pensam: "ooh a visualização do tempo eu vou fazer uma alteração lá" e então querem voltar para a visualização do mapa. Em seguida, faça o backup novamente porque eles querem voltar para a tela de Login. Por que está sendo B weather appexibido e por que não salvou as configurações do nível D?

O programador pode ser capaz de aliviar alguma confusão se as Atividades Be Destiverem vinculadas no estado. Dessa forma, muda para um muda o outro. Cada vez que o usuário abre uma nova tela de clima, ele abre secretamente uma única instância da tela de clima.

Nessas circunstâncias, pode ser desejável alterar taskAffinity da Activity. O usuário mudaria o nível D. Em seguida, voltaria ao nível B. E veria as alterações em B que foram feitas em D.

O programa mantém uma pilha pela qual você pode fazer backup, o que é bom, e quando o usuário abre X instâncias da mesma atividade em lugares aleatórios, elas são todas uma.

Apresentação de slides com mais explicações: http://www.slideshare.net/RanNachmany/manipulating-android-tasks-and-back-stack

Eric Leschinski
fonte
13
Que tal usar o em singleInstancevez de usar o taskAffinity?
hguser
5
No caso descrito acima, eu preferiria usar Intent.FLAG_ACTIVITY_REORDER_TO_FRONT como um sinalizador no Intent que chama a Atividade D, isso traria a Atividade B acima de todas as outras e manteria apenas uma instância dela
EyalBellisha
63
Na verdade, essa resposta quase não toca em taskAffinitynada :-( A explicação é vaga. É incrível que essas respostas recebam tantos votos positivos.
David Wasser
6
Resposta tão longa, mas ainda não menciona o simples fato: taskAffinityé usado para especificar o nome da tarefa em que a atividade prefere ser executada. Quando um Intentcontém o sinalizador FLAG_ACTIVITY_NEW_TASK, a atividade é então colocada nesta tarefa específica (definida por taskAffinity).
Stan Mots
2
Although it's the same activity, it's a different STATE of that activity.Eu diria: "É outro exemplo dessa atividade."
Maksim Dmitriev
6

A afinidade indica a qual tarefa uma atividade prefere pertencer.

A afinidade entra em ação em duas circunstâncias:

Quando o intent que inicia uma atividade contém o sinalizador FLAG_ACTIVITY_NEW_TASK.

Quando uma atividade tem seu atributo allowTaskReparenting definido como "true".

Consulte http://developer.android.com/guide/components/tasks-and-back-stack.html

hitesh141
fonte
26
Obrigado por copiar de developer.android.com
Anirban
Isso não explica nada. O que isso significa na prática?
James Andrews