Modo lettore o smistamento in primo piano: quale usare in un'applicazione Android?
Il modo lettore, per uno schermo fatto per leggere tag. Consegna ogni tag a una funzione di richiamo, può saltare il controllo NDEF e il suono del sistema, e sospende l'emulazione di scheda mentre gira. Lo smistamento in primo piano si addice a un'applicazione che incontra tag ogni tanto e li vuole come Intent, come il resto dei suoi ingressi.
Quello che fanno entrambi
Entrambi danno all'attività sullo schermo il primo diritto sul prossimo tag, prima di ogni applicazione che si è registrata per i tag nel suo manifest. Il riferimento di NfcAdapter descrive lo smistamento in primo piano come il dare priorità all'attività in primo piano, e il modo lettore come il limitare il controller mentre l'attività è in primo piano.
Nessuno dei due sopravvive all'uscita dell'attività dallo schermo. Lo smistamento in primo piano va attivato mentre l'attività è ripresa e disattivato prima che il suo onPause finisca, e chiamarlo mentre l'attività non è in primo piano solleva IllegalStateException.
E nessuno dei due cambia quello che succede quando l'applicazione è chiusa. Un tag che deve avviare l'applicazione passa per il manifest, che la pagina del manifest copre.
Quello che cambia il modo lettore
Il modo lettore trasforma il controller in un lettore e in nient'altro. Il riferimento dichiara che disattiva il punto a punto e l'emulazione di scheda per tutto il tempo in cui gira, quindi chi apre il tuo schermo di lettura a una cassa non può pagare con il telefono finché non ne esce.
Sonda solo le tecnologie che nomini, tramite contrassegni come FLAG_READER_NFC_A o FLAG_READER_NFC_V. Uno schermo fatto per etichette ISO/IEC 15693 che sonda solo NFC-V non reagisce a una carta bancaria tenuta lì accanto.
FLAG_READER_SKIP_NDEF_CHECK impedisce alla piattaforma di leggere il tag in cerca di NDEF prima che giri la tua funzione di richiamo. Il riferimento è esplicito sul prezzo: la classe Ndef non viene allora enumerata sul tag, e lo smistamento basato su NDEF non funziona. È il contrassegno per uno schermo che invia comandi propri, e quello sbagliato per uno schermo che legge messaggi.
FLAG_READER_NO_PLATFORM_SOUNDS zittisce il suono di rilevamento del sistema, il che lascia alla tua applicazione il compito di dire che è successo qualcosa. L'extra EXTRA_READER_PRESENCE_CHECK_DELAY fissa il ritardo con cui la piattaforma verifica che il tag sia ancora lì.
I tag arrivano tramite onTagDiscovered invece che come Intent. Dal livello di API 37 la funzione di richiamo ha anche onTagLost, chiamata quando il tag se ne va; prima di quel livello, un'uscita compare come un'eccezione allo scambio successivo.
Per un telefono che emula una scheda tramite Host Card Emulation, il riferimento raccomanda FLAG_READER_NFC_A insieme a FLAG_READER_SKIP_NDEF_CHECK.
Quello che lo smistamento in primo piano conserva
Lo smistamento in primo piano cambia chi riceve il tag e poco altro. La piattaforma continua a leggere il tag in cerca di NDEF e continua a emettere il suo suono di rilevamento, dato che il contrassegno che lo zittisce appartiene al modo lettore, e niente nel riferimento sospende l'emulazione di scheda mentre è attivo.
Il tag arriva come un Intent, tramite il PendingIntent che passi. La guida all'NFC avanzato lo costruisce con FLAG_MUTABLE, perché il sistema deve aggiungere il tag all'Intent, e da Android 12 il riferimento di PendingIntent esige che ogni PendingIntent dichiari la propria mutabilità. Lo stesso esempio aggiunge FLAG_ACTIVITY_SINGLE_TOP, così che il tag raggiunga l'attività aperta in onNewIntent invece di avviare una seconda copia.
I filtri e gli elenchi di tecnologie restringono quello che l'attività riceve, con le stesse regole del manifest. Passare null per entrambi fa ricevere all'attività ogni tag tramite ACTION_TAG_DISCOVERED, un'azione che il riferimento segna come obsoleta dal livello di API 37.
La consegna atterra in onNewIntent, e la guida ai processi e ai thread dice che i richiami del ciclo di vita girano sempre sul thread principale. Ogni scambio con il tag deve andare altrove, dato che il riferimento di TagTechnology vieta l'ingresso e l'uscita su quel thread.
Scegliere fra i due
| Domanda | Modo lettore | Smistamento in primo piano |
|---|---|---|
| Come arriva il tag | Una funzione di richiamo, onTagDiscovered | Un Intent, in onNewIntent |
| Emulazione di scheda mentre è attivo | Sospesa | Invariata |
| Tecnologie sondate | Solo quelle nominate dai contrassegni | Tutte |
| Controllo NDEF e suono del sistema | Si possono saltare | Sempre eseguiti |
| Disponibile da | Livello di API 19 | Livello di API 10 |
Scegli il modo lettore quando lo schermo esiste per leggere tag: un controllo di inventario, uno strumento di configurazione, un lettore per una scheda proprietaria. Il tag va dritto al tuo codice e nient'altro sul telefono se lo contende.
Scegli lo smistamento in primo piano quando i tag sono un ingresso fra gli altri, e il telefono deve continuare a pagare e a comportarsi normalmente mentre la tua attività è aperta.
Domande frequenti
Perché il telefono smette di pagare mentre la mia applicazione è aperta?
Il modo lettore è attivo. Il riferimento dichiara che disattiva l'emulazione di scheda per tutto il tempo in cui l'attività è in primo piano, quindi tienilo per gli schermi il cui scopo è leggere.
Quali contrassegni servono per leggere un altro telefono?
Per un telefono che emula una scheda tramite Host Card Emulation, il riferimento raccomanda FLAG_READER_NFC_A insieme a FLAG_READER_SKIP_NDEF_CHECK.
Servono ancora i filtri di Intent nel manifest?
Solo per i tag che devono avviare l'applicazione quando non è aperta. Né il modo lettore né lo smistamento in primo piano valgono finché un'attività non è sullo schermo.
Perché enableForegroundDispatch solleva IllegalStateException?
È stato chiamato mentre l'attività non era in primo piano, per esempio da onCreate. Attivalo in onResume e disattivalo in onPause.