2010-09-10 12 views
7

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 establece que si un Intento se dirige a dicha Actividad cuando hay Actividades ubicadas encima de ella en su pila de tareas, tales Intenciones se descartan (aunque la tarea todavía se lleva al primer plano).Android: ¿Comportamiento de launchMode = "singleTask" no como se describe?

He estado jugando con esto, y el comportamiento que observo es completamente diferente. En particular: - Las actividades con launchMode = "singleTask" no siempre son la actividad raíz en una pila de tareas. Simplemente se colocan en la cima de la pila existente con la misma afinidad. - Cuando un Intento está dirigido a dicha Actividad y hay otras Actividades encima de él en la pila, el Intento no se descarta. En su lugar, las Actividades que están arriba en la pila se descartan. El Intento se entrega a través de onNewIntent a la Actividad de forma normal.

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

EDIT:

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 la cruz-post, sin embargo he podido conseguir el ejemplo de un formato decente para publicar aquí ...

+0

puedo confirmar este comportamiento, pero tampoco lo entiendo. las actividades infantiles son destruidas. –

Respuesta

0

Puedo agregar algo de experiencia de comportamiento extraño a este modo. Quizás la respuesta de esta pregunta también me ayuda.

Quería darle a mi primera pantalla una búsqueda de selección de ubicación. Quería pasar la consulta a mi primera actividad. Esa actividad era 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 llegó a mi primera actividad. En cambio, "android.intent.action.MAIN" alcanzó mi primera actividad. Al eliminar "singleTask", la Búsqueda- intención consigue a través. Pero entonces crear 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 lugar ...

4

Este es un problema de taskAffinity. al iniciar una actividad, comprueba el Android taskAffinity de la actividad que desea iniciar. Si es lo mismo que el taskAffinity de t él inicia la actividad en su tarea, entonces va a ignorar launchMode="singleInstance" o launchMode="singleTask" (porque esos modos de lanzamiento requerirían Android para crear una nueva tarea para iniciar la actividad) y comenzar la actividad en la tarea actual.

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

Si realmente desea una actividad de singleTask o singleInstance (que generalmente no es lo correcto porque trae consigo toda una serie de otras cosas desagradables que es probable que obtenga mal), entonces necesita asegurarse que su actividad singleInstance o singleTask tiene la siguiente en el manifiesto en su definición <activity>:

android:taskAffinity="" 
2

Documentation dice:

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

¿Cómo se inicia la actividad con Intención (FLAG_ACTIVITY_NEW_TASK) depends on activity affinity

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

Por lo tanto, debe haber una comprobación de afinidad igual para singleTask launchMode.

+0

No creo que ambos produzcan el "mismo" comportamiento. Suponiendo que las afinidades son correctas, singleTask también intentará borrar las actividades de la tarea, excepto la raíz. – zgulser

Cuestiones relacionadas