Vai al contenuto
Lingua: IT

Come si gestisce un tag che arriva mentre la tua attività è aperta?

Consegnalo all'istanza che è già sullo schermo. Dichiara l'attività singleTop, oppure aggiungi FLAG_ACTIVITY_SINGLE_TOP all'Intent dello smistamento in primo piano, e leggi il tag in onNewIntent. Senza questo, ogni tocco avvia una nuova copia dell'attività sopra la precedente, e Indietro passa per ogni tocco precedente.

Quello che succede per impostazione predefinita

Un tag viene consegnato con startActivity, e la modalità di avvio predefinita risponde a ogni avvio con una nuova istanza. La guida ai compiti e alla pila di ritorno mostra il risultato: una pila A, B, C e D diventa A, B, C, D e D.

Per uno schermo che legge tag, questo vuol dire una copia nuova a ogni tocco. Ogni copia ha il proprio stato e il proprio tag, e Indietro le attraversa tutte prima di uscire dall'applicazione.

singleTop e onNewIntent

Con la modalità di avvio singleTop, un Intent per un'attività che è già in cima alla pila va a quell'istanza, tramite onNewIntent(), e nessuna copia viene creata. FLAG_ACTIVITY_SINGLE_TOP sull'Intent ha lo stesso effetto, ed è per questo che l'esempio di smistamento in primo piano nella guida all'NFC avanzato lo aggiunge al suo PendingIntent.

La consegna passa per una pausa. Il riferimento di Activity dice che un'attività non riceve mai un nuovo Intent mentre è ripresa: viene messa in pausa, riceve l'Intent, poi riprende. Lo smistamento in primo piano, disattivato in onPause e riattivato in onResume, segue quel ciclo a ogni tocco.

Anche singleTask instrada l'Intent verso l'istanza esistente, ma cambia il compito in cui l'attività vive e distrugge le attività che le stanno sopra. Per uno schermo di lettura, singleTop è il cambiamento più piccolo.

getIntent porta ancora il primo tag

Il riferimento di Activity è esplicito: dopo onNewIntent(), getIntent() rende ancora l'Intent originale. Il codice che legge il tag da getIntent() in onResume tratta di nuovo il primo tag a ogni tocco successivo.

Chiama setIntent() con il nuovo Intent, oppure leggi il tag in onNewIntent() e mai da getIntent().

Un tag vecchio è peggio di uno sbagliato. Il riferimento di Tag dice che un nuovo oggetto Tag viene creato a ogni rilevamento e che solo il più recente può aprire una classe di tecnologia, e un oggetto riusato dopo che il suo tag se n'è andato solleva SecurityException.

Il modo lettore evita la domanda

Il modo lettore non usa gli Intent. I tag raggiungono una funzione di richiamo nell'attività che lo ha attivato, quindi non c'è alcuna modalità di avvio da sbagliare né alcuna seconda istanza da creare.

Per uno schermo che legge molti tag di fila, come un controllo di inventario, è il progetto più semplice, confrontato nella pagina del modo lettore.

Domande frequenti

Perché la mia applicazione tratta di nuovo il primo tag dopo un secondo tocco?

getIntent rende ancora l'Intent originale dopo onNewIntent. Chiama setIntent con quello nuovo, oppure leggi il tag in onNewIntent.

L'attività dovrebbe usare singleTask?

Consegna anch'essa all'istanza esistente, ma cambia il compito dell'attività e distrugge le attività che le stanno sopra. singleTop è la correzione più stretta per uno schermo di lettura.

Perché Indietro attraversa diverse copie del mio schermo?

L'attività usa la modalità di avvio normale, quindi ogni tocco ha avviato una nuova istanza. singleTop, o il contrassegno corrispondente sull'Intent di smistamento, ferma l'accumulo.

Il tag è ancora utilizzabile quando gira onNewIntent?

Solo finché è ancora nel campo. Sposta subito altrove ogni scambio, dato che uno scambio avviato tardi incontra un tag che chi usa il telefono ha già tolto.