Aller au contenu
Langue : FR

Comment traiter un tag qui arrive pendant que votre activité est ouverte ?

En déclarant l'activité en singleTop, ou en posant le drapeau correspondant sur l'Intent de distribution : le tag arrive alors dans onNewIntent au lieu de créer une seconde copie. Et il faut lire le tag depuis cet Intent, car getIntent rend encore le premier tant que setIntent n'a pas été appelé.

Ce qui se passe par défaut

Un tag est remis par startActivity, et le mode de lancement par défaut répond à chaque démarrage par une nouvelle instance. Le guide des tâches et de la pile de retour en montre le résultat : une pile A, B, C et D devient A, B, C, D et D.

Pour un écran qui lit des tags, cela fait une copie par tap. Chaque copie a son propre état et son propre tag, et le retour arrière les traverse toutes avant de quitter l'application.

singleTop et onNewIntent

Avec le mode de lancement singleTop, un Intent destiné à une activité déjà au sommet de la pile va à cette instance, par onNewIntent(), et aucune copie n'est créée. FLAG_ACTIVITY_SINGLE_TOP posé sur l'Intent a le même effet, ce qui explique que l'exemple de dispatch au premier plan du guide NFC avancé l'ajoute à son PendingIntent.

La remise passe par une pause. La référence d'Activity indique qu'une activité ne reçoit jamais un nouvel Intent pendant qu'elle est reprise : elle est mise en pause, reçoit l'Intent, puis reprend. Le dispatch au premier plan, désactivé dans onPause et réactivé dans onResume, suit ce cycle à chaque tap.

singleTask achemine aussi l'Intent vers l'instance existante, mais il change la tâche dans laquelle vit l'activité et détruit les activités au dessus d'elle. Pour un écran de lecture, singleTop est le changement le plus petit.

getIntent porte encore le premier tag

La référence d'Activity est explicite : après onNewIntent(), getIntent() rend toujours l'Intent d'origine. Un code qui lit le tag depuis getIntent() dans onResume retraite donc le premier tag à chacun des taps suivants.

Appelez setIntent() avec le nouvel Intent, ou lisez le tag dans onNewIntent() et jamais depuis getIntent().

Un tag périmé est pire qu'un tag faux. La référence de Tag indique qu'un nouvel objet Tag est créé à chaque découverte et que seul le plus récent peut ouvrir une classe de technologie ; un objet réemployé après le départ de son tag lève SecurityException.

Le mode lecteur évite la question

Le mode lecteur n'emploie pas d'Intent. Les tags atteignent une fonction de rappel dans l'activité qui l'a activé : il n'y a donc pas de mode de lancement à manquer, ni de seconde instance à créer.

Pour un écran qui lit beaucoup de tags à la suite, un inventaire par exemple, c'est la conception la plus simple, comparée sur la page du mode lecteur.

Questions fréquentes

Pourquoi mon application retraite-t-elle le premier tag au second tap ?

getIntent rend encore l'Intent d'origine après onNewIntent. Appelez setIntent avec le nouveau, ou lisez le tag dans onNewIntent.

L'activité devrait-elle plutôt employer singleTask ?

Il remet lui aussi à l'instance existante, mais il change la tâche de l'activité et détruit les activités au dessus d'elle. singleTop est la correction la plus étroite pour un écran de lecture.

Pourquoi le retour arrière traverse-t-il plusieurs copies de mon écran ?

L'activité emploie le mode de lancement standard : chaque tap a lancé une nouvelle instance. singleTop, ou le drapeau correspondant sur l'Intent de distribution, met fin à l'empilement.

Le tag est-il encore utilisable quand onNewIntent s'exécute ?

Seulement tant qu'il est encore dans le champ. Déplacez tout échange hors du fil principal sans attendre, car un échange lancé tard rencontre un tag que l'utilisateur a déjà retiré.