Caso prefira, você encontrará todo esse material, em inglês, no site do Developer Android. A tradução e comentários dos materiais eu faço livremente para ajudar a comunidade que fala português.

quarta-feira, 23 de março de 2011

Atividades - Tarefas e Back Stack

Uma aplicação usualmente contém multiplas atividades. Cada atividade deve ser desenhada para um tipo específico de ação que o usuário quer executar e cada atividade pode iniciar uma nova atividade. Por exemplo, uma aplicação de email pode ter uma atividade que mostra uma lista de novos emails. Quando o usuário seleciona um email, uma nova atividade abre para que o email seja mostrado.

Uma atividade pode também iniciar atividades que existem em outras aplicações no dispositivo. Por exemplo, se sua aplicação quer enviar um email, você pode definir um intent para executar a ação de enviar o email e incluir alguns dados, como o endereço de email e a mensagem a ser enviada. Uma atividade de outra aplicação que declara a si mesmo como capaz de executar tal tarefa então se abre. Nesse caso, o intent (ou intenção) é enviar um email, então a atividade que é responsável pela composição de email se abre (se multiplas atividades suportam a mesma intent, então o sistema deixa o usuário escolher qual utilizará). Assim que o email é enviado, sua atividade é volta à tela e para o usuário vai parecer que a atividade de envio de email é parte de sua aplicação. Mesmo que a atividade seja de uma aplicação diferente, o Android mantém essa experiência bastante fluída para o usuário, mantendo ambas atividades dentro de uma mesma tarefa.

Uma tarefa é uma coleção de atividades onde os usuários interagem fazendo certos trabalhos. As atividades são arranjadas numa pilha (a "back stack") na ordem em que as atividades são abertas.

O home screen do dispositivo é normalemente o ponto de partida onde quase todas as tarefas se iniciam. Quando o usuário toca o ícone de uma aplicação dentro do launcher (ou mesmo a partir de um atalho na área de trabalho), a aplicação é aberta e vem para a frente. Se nenhuma tarefa existir para a aplicação (a aplicação não foi usada recentemente), então uma nova tarefa é criada e a atividade principal (mais) para aquela aplicação se abre como a atividade raiz na pilha.

Quando a atividade corrente chama outra atividade, uma nova atividade é colocada no topo da pilha e ganha o foco. A atividade anterior permanece na pilha, mas está parada. Quando uma atividade pára, o sistema mantém o estado corrente de sua interface de usuário. Quando o usuário pressiona o botão BACK, a atividade corrente é retirada do topo da pilha (i.e. a atividade é destruída) e a atividade anterior se reinicia (o estado anterior da interface também é restaurado). Atividades na pilha nunca são rearranjadas, apenas inseridas ou retiradas da pilha - colocadas na pilha quando iniciada pela atividade atual e retirada quando o usuário pressiona BACK. Dessa maneira, o back stack funciona com a estrutura "last in, first out". Abaixo uma imagem que mostra o timeline mostrando o progresso de atividades dentro do back stack.


Se o usuário continuar a pressionar o botão BACK, então cada atividade na pilha será retirada e a atividade anterior será reaberta até que seja retornado para a home screen (ou qualquer outra atividade que estivesse sendo rodada quando a tarefa se iniciou). Quando todas as atividades são removidas da pilha, a tarefa não mais existe.

Uma tarefa é uma unidade coesa que pode ser movida para background quando o usuário inicia uma nova tarefa ou quando volta para a home screen, pressionando o botão HOME. Enquanto estiver em modo background, todas as atividades dentro da tarefa são paradas, mas o back stack para a tarefa se mantém intacto - a tarefa simplesmente perdeu o foco enquanto outra tarefa está sendo rodada, como mostrada na imagem acima. Uma tarefa pode então retornar para a tela para que usuários possam continuar do ponto onde pararam. Suponha, por exemplo, que a tarefa corrente (Task A) tem três atividades em sua pilha - dois dentro da atividade corrente. O usuário pressiona o botão HOME e inicia uma nova aplicação a partir do launcher. Quando a home screen aparece, a Task A vai para background e fica lá, aguardando ser chamada novamente. Quando a nova aplicação se inicia, o sistema inicia uma nova tarefa para essa aplicação (Task B) que tem sua própria pilha de atividades. Após interagir com a aplicação, o usuário retorna à home screen novamente e seleciona a aplicação que originalmente iniciou a tarefa Task A. Agora, Task A volta do background para a tela - todas as suas três atividades na pilha estão intactas e a atividade no topo da pilha se reinicia. Nesse ponto, o usuário pode também voltar para a Task B indo para a home screen e selecionando novamente a aplicação que iniciou a tarefa Task B. Esse é um exemplo de multitasking em Android.

Nota: Multiplas tarefas podem ser guardadas em background de uma vez. Contudo, se o usuário estiver rodando muitas tarefas em background de uma vez, o sistema pode começar a destruí-las para liberar recursos no dispositivo, causando a perda dessas atividades.

Como as atividades que ficam na back stack nunca são rearranjadas, se sua aplicação permitir iniciar uma atividade particular a partir de mais de uma atividade, uma nova instância para essa atividade é criada e inserida na pilha (ao invés de trazer a atividade já existente para o topo). Pode conta disso, uma atividade em sua aplicação pode ser instanciada multiplas vezes (mesmo a partir de diferentes tarefas). Por conta disso, quando o usuário navegar no sentido inverso usando o botão BACK, cada instancia da atividade é revelada na ordem inversa a que elas foram abertas. Você pode modificar o comportamento e veremos como fazê-lo mais tarde.

Para sumarizar o comportamento padrão das atividades e tarefas:

  • Quando a atividade A inicia a atividade B, a atividade A é parada, mas o sistema mantém seu estado. Se o usuário pressiona o botão BACK enquanto usa a atividade B, a atividade A reinicia-se com seu estado restaurado.
  • Quando o usuário deixa uma tarefa pressionando o botão HOME, a atividade corrente é parada e sua tarefa é enviada para background. O sistema mantém o estado de cada atividade dentro da tarefa. Se o usuário voltar para a tarefa, ela volta para a tela e reinicia a atividade que estiver no topo da pilha.
  • Se o usuário pressiona o botão de BACK, a atividade sendo executada é retirada da pilha e destruída. A atividade anterior é então reiniciada. Quando uma atividade é destruída, o sistema NÃO mantém seu estado de atividade.
  • Atividades podem ser instanciadas multiplas vezes, mesmo a partir de outras tarefas.
No próximo post, como gerenciar tarefas.

0 comentários:

Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
Related Posts Plugin for WordPress, Blogger...