Como tratar uma tag que chega enquanto a sua atividade está aberta?
Entregue-a à instância que já está na tela. Declare a atividade singleTop, ou acrescente FLAG_ACTIVITY_SINGLE_TOP à intent do despacho em primeiro plano, e leia a tag em onNewIntent. Sem isso, cada toque abre uma cópia nova da atividade em cima da anterior, e o Voltar percorre todos os toques anteriores.
O que acontece por padrão
Uma tag é entregue com startActivity, e o modo de inicialização padrão responde a toda abertura com uma instância nova. O guia das tarefas e da pilha de retorno mostra o resultado: uma pilha A, B, C e D passa a ser A, B, C, D e D.
Para uma tela que lê tags, isso quer dizer uma cópia nova por toque. Cada cópia tem o próprio estado e a própria tag, e o Voltar percorre todas elas antes de sair do aplicativo.
singleTop e onNewIntent
Com o modo de inicialização singleTop, uma intent destinada a uma atividade que já está no topo da pilha vai para aquela instância, por onNewIntent(), e nenhuma cópia é criada. FLAG_ACTIVITY_SINGLE_TOP na intent tem o mesmo efeito, e é por isso que o exemplo de despacho em primeiro plano do guia de NFC avançado o acrescenta ao PendingIntent dele.
A entrega passa por uma pausa. A referência de Activity diz que uma atividade nunca recebe uma intent nova enquanto está retomada: ela é pausada, recebe a intent, e depois retoma. O despacho em primeiro plano, desativado em onPause e ativado de novo em onResume, segue esse ciclo a cada toque.
singleTask também encaminha a intent para a instância existente, mas muda a tarefa em que a atividade vive e destrói as atividades acima dela. Para uma tela de leitura, singleTop é a mudança menor.
getIntent ainda guarda a primeira tag
A referência de Activity é explícita: depois de onNewIntent(), getIntent() ainda devolve a intent original. Um código que lê a tag a partir de getIntent() em onResume trata a primeira tag de novo a cada toque seguinte.
Chame setIntent() com a intent nova, ou leia a tag em onNewIntent() e nunca a partir de getIntent().
Uma tag velha é pior que uma errada. A referência de Tag diz que um objeto Tag novo é criado a cada descoberta e que só o mais recente consegue abrir uma classe de tecnologia, e um objeto reaproveitado depois que a tag dele saiu levanta SecurityException.
O modo leitor evita a pergunta
O modo leitor não usa intents. As tags chegam a um retorno de chamada na atividade que o ativou, então não há modo de inicialização para errar nem segunda instância para criar.
Para uma tela que lê muitas tags em sequência, como uma conferência de estoque, ele é o projeto mais simples, comparado na página do modo leitor.
Perguntas frequentes
Por que o meu aplicativo trata a primeira tag de novo depois de um segundo toque?
getIntent ainda devolve a intent original depois de onNewIntent. Chame setIntent com a nova, ou leia a tag em onNewIntent.
A atividade deve usar singleTask em vez disso?
Ele também entrega à instância existente, mas muda a tarefa da atividade e destrói as atividades acima dela. singleTop é o conserto mais estreito para uma tela de leitura.
Por que o Voltar percorre várias cópias da minha tela?
A atividade usa o modo de inicialização padrão, então cada toque abriu uma instância nova. singleTop, ou o sinalizador correspondente na intent do despacho, põe fim ao empilhamento.
A tag ainda dá para usar quando onNewIntent roda?
Só enquanto ela continua no campo. Mova toda troca para fora da thread principal na hora, já que uma troca começada tarde encontra uma tag que o usuário já tirou.