Um aplicativo Android consegue reagir a uma tag sem mostrar uma tela?
Não inteiramente. O Android entrega uma tag abrindo uma atividade, então sempre existe uma, e o celular só procura tags enquanto está desbloqueado. O mais perto do silêncio é uma atividade que não desenha nada e se encerra antes de ser retomada, um caso para o qual a plataforma oferece um tema.
Uma tag sempre abre uma atividade
A referência de Tag descreve um destino para uma tag descoberta: uma única atividade, aberta com startActivity. Nenhum serviço, receptor ou trabalho aparece nesse caminho.
O modo leitor e o despacho em primeiro plano não mudam isso. Os dois precisam de uma atividade em primeiro plano, então servem a um aplicativo que já está aberto, e não a um que reage do segundo plano.
Uma atividade que não desenha nada
O Android traz um tema para esse caso. A referência de R.style descreve Theme.NoDisplay como o tema das atividades que não mostram uma interface, porque elas se encerram antes de serem retomadas.
Esse tempo é a restrição. O trabalho tem de caber antes de a atividade ser retomada, o que exclui uma troca longa com a tag e convém a um conteúdo que chegou com a intent.
O conteúdo em geral chega mesmo com ela. O guia de NFC do Android torna o extra EXTRA_NDEF_MESSAGES obrigatório em ACTION_NDEF_DISCOVERED, então as mensagens já analisadas estão ali sem uma leitura a mais.
Qualquer coisa mais longa pertence a um componente feito para trabalho em segundo plano: a atividade lê a mensagem, passa o trabalho adiante, e se encerra.
O que ainda a limita
O celular tem de estar procurando. O guia de NFC do Android diz que os aparelhos Android em geral procuram tags enquanto a tela está desbloqueada, então um celular bloqueado num bolso não reage a nada, por mais silenciosa que a atividade seja.
O usuário ouve a tag mesmo quando nada aparece. A plataforma toca o som de descoberta dela, e o sinalizador que o silencia pertence ao modo leitor, que precisa de uma atividade visível.
O aplicativo tem de ser elegível. A partir do Android 17, a documentação diz que as intents de NFC já não são despachadas para um aplicativo num estado parado, nunca aberto pelo usuário ou parado à força, e a partir do Android 16 os usuários podem recusar as intents de tag aplicativo por aplicativo.
Os links da web são um caso à parte. A partir do Android 16 uma tag que guarda um link http ou https vai para ACTION_VIEW, e a partir do Android 17 ela espera que o usuário responda a um aviso, então uma reação silenciosa a um link da web não está em oferta de jeito nenhum.
Quando uma tela visível é melhor
Um toque é uma pergunta, e o silêncio é uma resposta ambígua. O usuário não consegue distinguir uma ação que rodou de uma tag que não foi lida, e o toque seguinte, feito como uma nova tentativa, roda a ação duas vezes.
Então confirme, mesmo que rapidamente, com um aviso ou uma mensagem curta. Uma reação inteiramente silenciosa convém às ações cujo efeito aparece em outro lugar, como uma luz que acende.
Onde a ação já vive num aplicativo de rotinas, esse aplicativo cuida disso por você, como descreve a página das rotinas do Android.
Perguntas frequentes
Um serviço consegue ler tags em segundo plano?
Nenhum caminho documentado permite isso. O despacho abre uma atividade, e o modo leitor e o despacho em primeiro plano exigem os dois uma atividade em primeiro plano.
Funciona com a tela desligada?
Em geral não. A documentação diz que os aparelhos procuram tags enquanto a tela está desbloqueada, e os fabricantes podem diferir, então isso tem de ser testado em cada modelo.
O aplicativo vai receber tags se o usuário nunca o abriu?
Não a partir do Android 17. A documentação diz que as intents de NFC não são despachadas para um aplicativo num estado parado, o que inclui um que o usuário nunca abriu.
Dá para desligar o som de descoberta?
Só no modo leitor, com FLAG_READER_NO_PLATFORM_SOUNDS, e o modo leitor precisa de uma atividade visível. Uma atividade silenciosa é silenciosa na tela, não no ouvido.