2010-07-16 12 views
20

Me acaba de quemar un widget. Pude ver la causa del problema, pero no pude determinar por qué ni su solución. Mi widget estaba emitiendo una búsqueda (SearchManager) y la actividad lanzó un cuadro de diálogo de búsqueda, pero cuando llamó a mi widget, creó otra referencia al widget (es decir, el id-thread era el mismo, pero el widget-id cambiado de 65 a 0).¿Cuándo es necesario usar singleTop launchMode en un widget o aplicación de Android?

Esto me llevó a creer que se estaba creando una nueva instancia y busqué en la documentación la configuración que se aplicaría al problema. Finalmente, me encontré con el android:launchMode="singleTop" y tan pronto como lo configuré en el AndroidManifest, ¡viola! Mi widget funcionó.

Esto me llevó la mejor parte de dos días en depurar.

¿Hay alguna otra situación o hay una respuesta más técnicamente correcta para mi problema?

+1

No creo que el título de la pregunta sea útil para los contenidos. Esperaba ver una pregunta y respuestas sobre casos de uso apropiados para singleTop. Esto es un poco de narrativa de desarrollo y luego una cita de la documentación. – helloPiers

+1

@ Lot105 - bastante justo. Continúa y agrega algunas respuestas. Fue un gran problema que encontré, así que hice la "pregunta y respuesta a su propia pregunta", como sugiere SO. Estoy seguro de que su (s) contribución (es) de respuesta y otras mejorarían esta Q & A. Ha tenido más de 3000 vistas, por lo que es claramente interesante. Dudo que mi respuesta sea la * SOLAMENTE * respuesta :) Y, por supuesto, es una referencia y una cita del documento ya que de allí obtuve mi respuesta. Personalmente, encuentro un valor real en este tema de estilo/respuesta, ya que aclara DOC. – mobibob

+1

Debería haber sido más claro. La pregunta cuerpo y respuesta son útiles e interesantes por derecho propio, absolutamente. – helloPiers

Respuesta

36

Hice más lectura en Android Docs - Podría pasar toda la vida leyendo sus documentos y encontrar un nuevo detalle sutil que me rompa el cerebro :) Esto explica mis múltiples instancias que no esperaba, sin embargo, configuré para ocurrir.

Android Doc on Activity definition for AndroidManifest.xml

Los modos "estándar" y "singleTop" difieren entre sí en tan sólo un respecto: Cada vez que hay nuevo intento para una actividad "estándar", una nueva instancia de la la clase se crea a responde a esa intención. Cada instancia maneja un único intento. Del mismo modo, una nueva instancia de una actividad "singleTop" también se puede crear para manejar un nuevo intento . Sin embargo, si la tarea de destino ya tiene una instancia existente de la actividad en la parte superior de su pila, esa instancia recibirá el nuevo intento (en una llamada onNewIntent()); una nueva instancia no se crea. En otras circunstancias , por ejemplo, si una instancia existente de la actividad "singleTop" está en la tarea de destino, pero no está en la parte superior de la pila, o si está en la parte superior de una pila, pero no en la tarea de destino: una nueva instancia sería se creará y se insertará en la pila.

+6

"o si está en la parte superior de una pila, pero no en la tarea objetivo, se crearía una nueva instancia y se insertaría en la pila". ¿Por qué? ¿Alguien puede explicar esta sección citada más? – Patrick

+0

@Patrick Creo que este escenario es cuando usas FLAG_ACTIVITY_NEW_TASK. En este caso, no le importan las tareas existentes y está creando una tarea nueva, de modo que su actividad se convierte en la única en la nueva tarea.Corrígeme si estoy equivocado. –

Cuestiones relacionadas