Android: Comportamiento de launchMode = "singleTask" no como se describe?

He estado aprendiendo Android y me he encontrado con un problema con launchMode = "singleTask". La documentación indica que cuando se utiliza este atributo, la actividad siempre se inicia en una nueva tarea como la actividad raíz. En segundo lugar, la documentación indica que si un Intent está dirigido a una Actividad de este tipo cuando hay Actividades situadas encima de ella en su pila de tareas, tales Intentos son descartados (aunque la tarea aún se lleva a primer plano).

He estado jugando con esto, y el comportamiento que observo es completamente diferente. En particular: – Las actividades con launchMode = "singleTask" no son siempre la actividad raíz en una pila de tareas. Ellos son sólo plonked ontop de la pila existente con la misma afinidad. – Cuando una Intención está dirigida a tal Actividad y hay otras Actividades encima de ella en la pila, la Intención no se descarta. En su lugar, las actividades por encima de ella en la pila se descartan. La Intención se entrega luego en OnNewIntent a la Actividad como es normal.

¿Puede alguien confirmar que este es el comportamiento real? Si es así, ¿por qué los documentos son incorrectos? Si no lo he hecho mal. . .

EDITAR:

Un ejemplo que demuestra este comportamiento se puede encontrar aquí: http://groups.google.co.uk/group/android-developers/browse_thread/thread/fd8f249803b4688a# Lo siento por el cross-post, sin embargo, no pude obtener el ejemplo en Un formato decente para publicar aquí …

Este es un problema de taskAffinity . Al iniciar una actividad, Android comprueba la taskAffinity de taskAffinity que desea iniciar. Si es la misma que la taskAffinity de la actividad raíz en tu tarea, ignorará launchMode="singleInstance" o launchMode="singleTask" (porque esos modos de lanzamiento requerirían que Android creara una nueva tarea para iniciar la actividad) E iniciar la actividad en la tarea actual.

Desafortunadamente, esto no está bien documentado, pero taskAffinity tiene prioridad sobre launchMode .

Si realmente quieres una actividad singleTask o singleInstance (que normalmente no es lo correcto, ya que trae consigo un montón de otras cosas desagradables que es probable que te equivoques), entonces usted necesita para asegurarse de que su singleInstance o singleTask actividad singleTask tiene lo siguiente en el manifiesto en su definición de <activity> :

 android:taskAffinity="" 

La documentación dice:

FLAG_ACTIVITY_NEW_TASK … produce el mismo comportamiento que el "singleTask" launchMode …

Cómo se inicia la actividad con Intent (FLAG_ACTIVITY_NEW_TASK) depende de la afinidad de actividad

Si ya hay una tarea existente con la misma afinidad que la nueva actividad, la actividad se inicia en esa tarea. Si no, comienza una nueva tarea.

Por lo tanto, debe haber una búsqueda de afinidad igual para singleTask launchMode.

Puedo añadir algo de experiencia de comportamiento extraño a este modo. Tal vez la respuesta de esta pregunta me ayude también.

Quería dar a mi primera pantalla una búsqueda de selección de ubicación. Quería pasar la consulta a mi primera actividad. Esa Actividad fue la invocación de búsqueda y la recepción de consultas. Sin embargo, "singleTask" destruyó mis planes;

El intento de búsqueda con la consulta nunca alcanzó mi primera actividad. En lugar de "android.intent.action.MAIN" alcanzó mi primera actividad. Cuando quita "singleTask", el Search-Intent pasa. Pero luego creo varias instancias de mi pantalla de inicio.

 <activity android:label="@string/app_name" android:name="ActivityStart" android:screenOrientation="portrait" android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.SEARCH" /> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity> 

Ahora uso un TextView en su lugar …

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.