¿Modo de lanzamiento de Android singleTask o singleInstance? [cerrado]

84

Tengo una aplicación que tiene una lista como actividad principal y luego puede hacer clic en los elementos que abren una vista detallada de ese elemento. También tengo una actividad de búsqueda que es similar a la actividad principal y funciona según lo previsto.

Sin embargo, quiero que esta actividad de búsqueda solo tenga una instancia en la pila para que los usuarios puedan buscar varias veces y hacer clic en atrás los devolvería a la vista de uso anterior en la que estaban antes de comenzar a buscar (en lugar de volver a los resultados de búsqueda de uso anterior)

Tanto el modo de inicio singleTask como singelInstance parecen hacer lo que quiero, así que no estoy seguro de cuál debería usar para este propósito y por qué.

Kman
fuente

Respuestas:

141

Desde la página de conceptos básicos de la aplicación de la guía de desarrollo de Android:

De forma predeterminada, todas las actividades de una aplicación tienen afinidad entre sí, es decir, se prefiere que todas pertenezcan a la misma tarea.

Una actividad de "singleInstance" es la única actividad en su tarea. Si inicia otra actividad, esa actividad se iniciará en una tarea diferente independientemente de su modo de inicio, como si FLAG_ACTIVITY_NEW_TASK estuviera en la intención. En todos los demás aspectos, el modo "singleInstance" es idéntico a "singleTask".

Como se indicó anteriormente, nunca hay más de una instancia de una actividad "singleTask" o "singleInstance", por lo que se espera que esa instancia maneje todos los nuevos intentos. Una actividad "singleInstance" siempre está en la parte superior de la pila (ya que es la única actividad en la tarea), por lo que siempre está en posición de manejar la intent. Sin embargo, una actividad de "singleTask" puede tener o no otras actividades por encima de ella en la pila. Si lo hace, no está en posición de manejar la intención y la intención se descarta. (Aunque se descarta la intención, su llegada habría provocado que la tarea pasara a primer plano, donde permanecería).

4 actividades en una tarea

Dado que nunca hay más de una instancia de la Actividad con cualquiera de los modos de inicio, el botón Atrás siempre lo llevará a la instancia existente de la Actividad en su caso.

Una diferencia importante es que "singleTask" no requiere la creación de una nueva tarea para las nuevas actividades que se inician cuando se selecciona algo. Tampoco tendrá que eliminar esa nueva tarea en el botón Atrás cada vez.

Dado que su pila de actividades pertenece a una "tarea" de usuario, y no parece que tenga una estructura de intención intrincada donde singleInstance puede ser beneficioso para manejarlos siempre, sugeriría usar el modo de inicio singleTask.

Aquí hay una buena publicación de blog para obtener más información, así como la imagen acreditada: Serie de actividades y tareas de Android : una introducción al modelo de componente de interfaz de usuario de Android

Guzba
fuente
4
¡Gracias! parece una buena lectura ... la cosa es que me di cuenta de que realmente QUIERO instancias múltiples de una actividad y solo cuando la actividad en primer plano es una actividad de búsqueda y se realiza otra búsqueda debe usar esa actividad existente (como cómo funciona el mercado) Y por eso, el singeTop es exactamente lo que busco, pero gracias por la ayuda de todos modos =) gracias
Kman
1
Hey gracias. Esta publicación bien escrita me ayudó en caso de apuro.
Heladero
Gracias por los detalles, especialmente este (aunque se descarta la intención, su llegada habría provocado que la tarea pasara al primer plano, donde permanecería) , lo que instantáneamente despeja mi confusión. Estaba pensando en qué pasa si una actividad de tarea única no está en la parte superior de la pila mientras todavía quiero navegar hasta ella sin especificar FLAG_ACTIVITY_CLEAR_TOP .
neevek
30

De una manera sencilla

singleTask:

El sistema crea una nueva tarea y crea una instancia de la actividad en la raíz de la nueva tarea. Sin embargo, si una instancia de la actividad ya existe en una tarea separada, el sistema enruta la intención a la instancia existente a través de una llamada a su onNewIntent()método, en lugar de crear una nueva instancia. Solo una parte one instancede la actividad puede existir a la vez.

Nota: Aunque la actividad comienza en una nueva tarea, el botón Atrás aún devuelve al usuario a la actividad anterior.

única instancia-

Igual que "singleTask", excepto que el sistema no inicia ninguna otra actividad en la tarea que contiene la instancia . La actividad es siempre el único miembro de su tarea; cualquier actividad iniciada por este se abre en una tarea separada .

Tarun Varshney
fuente
4

singleTasky las singleInstanceactividades solo pueden comenzar una tarea. Siempre están en la raíz de la pila de actividades. Además, el dispositivo puede contener solo una instancia de la actividad a la vez, solo una de esas tareas.
para más android: launchMode .

Rupesh Yadav
fuente
1
la última oración es verdadera para singleInstance, no singleTask
Serdar Samancıoğlu
@SerdarS. agradezco su comentario. Agregar más sobre singleTask: el sistema crea una nueva tarea e instancia la actividad en la raíz de la nueva tarea. Sin embargo, si una instancia de la actividad ya existe en una tarea separada, el sistema enruta la intención a la instancia existente a través de una llamada a su onNewIntent()método, en lugar de crear una nueva instancia. Solo puede existir una instancia de la actividad a la vez. para obtener más información developer.android.com
Rupesh Yadav
Entendido, entonces me equivoqué. Lamento molestarte.
Serdar Samancıoğlu