¿Cómo se trata una etiqueta que llega con la actividad abierta?
Entrégala a la instancia que ya está en pantalla. Declara la actividad singleTop, o añade FLAG_ACTIVITY_SINGLE_TOP al intent del despacho en primer plano, y lee la etiqueta en onNewIntent. Sin eso, cada toque arranca una copia nueva de la actividad encima de la anterior, y Atrás recorre todos los toques anteriores.
Lo que pasa por omisión
Una etiqueta se entrega con startActivity, y el modo de lanzamiento por omisión responde a cada arranque con una instancia nueva. La guía de tareas y pila de retroceso enseña el resultado: una pila de A, B, C y D pasa a ser A, B, C, D y D.
Para una pantalla que lee etiquetas, eso quiere decir una copia nueva por toque. Cada copia tiene su propio estado y su propia etiqueta, y Atrás las recorre todas antes de salir de la aplicación.
singleTop y onNewIntent
Con el modo de lanzamiento singleTop, un intent para una actividad que ya está en lo alto de la pila va a esa instancia, por onNewIntent(), y no se crea ninguna copia. FLAG_ACTIVITY_SINGLE_TOP en el intent tiene el mismo efecto, y por eso el ejemplo de despacho en primer plano de la guía NFC avanzada lo añade a su PendingIntent.
La entrega pasa por una pausa. La referencia de Activity dice que una actividad no recibe nunca un intent nuevo mientras está reanudada: se pausa, recibe el intent y se reanuda. El despacho en primer plano, desactivado en onPause y activado de nuevo en onResume, sigue ese ciclo en cada toque.
singleTask también lleva el intent a la instancia existente, pero cambia la tarea en la que vive la actividad y destruye las actividades que tiene encima. Para una pantalla de lectura, singleTop es el cambio más pequeño.
getIntent sigue teniendo la primera etiqueta
La referencia de Activity es explícita: después de onNewIntent(), getIntent() sigue devolviendo el intent original. Un código que lee la etiqueta desde getIntent() en onResume trata otra vez la primera etiqueta en cada toque posterior.
Llama a setIntent() con el intent nuevo, o lee la etiqueta en onNewIntent() y nunca desde getIntent().
Una etiqueta vieja es peor que una equivocada. La referencia de Tag dice que se crea un objeto Tag nuevo en cada descubrimiento y que solo el más reciente puede abrir una clase de tecnología, y un objeto reutilizado después de que su etiqueta se haya ido levanta SecurityException.
El modo lector evita la pregunta
El modo lector no usa intents. Las etiquetas llegan a una devolución de llamada en la actividad que lo activó, así que no hay modo de lanzamiento que equivocar ni segunda instancia que crear.
Para una pantalla que lee muchas etiquetas seguidas, como un recuento de existencias, es el diseño más sencillo, comparado en la página del modo lector.
Preguntas frecuentes
¿Por qué mi app trata otra vez la primera etiqueta tras un segundo toque?
getIntent sigue devolviendo el intent original después de onNewIntent. Llama a setIntent con el nuevo, o lee la etiqueta en onNewIntent.
¿Debería la actividad usar singleTask?
También entrega a la instancia existente, pero cambia la tarea de la actividad y destruye las que tiene encima. singleTop es el arreglo más estrecho para una pantalla de lectura.
¿Por qué Atrás recorre varias copias de mi pantalla?
La actividad usa el modo de lanzamiento normal, así que cada toque arrancó una instancia nueva. singleTop, o la marca en el intent del despacho, detiene el apilado.
¿La etiqueta sigue sirviendo cuando corre onNewIntent?
Solo mientras siga en el campo. Lleva cualquier intercambio fuera del hilo principal enseguida, ya que un intercambio empezado tarde se encuentra con una etiqueta que ya han retirado.