2012-03-19 6 views
13

Así que mi problema es:FLAG_ACTIVITY_NEW_TASK clarifique

  • comienzo App1, abierta Screen1 y luego Screen2.
  • Presiono Inicio, dejando la aplicación 1 en segundo plano.
  • Abro App2, inicio App1.Screen1 con FLAG_ACTIVITY_NEW_TASK, esperando estar en App1.Screen2 en la tarea anterior. En su lugar, estoy en App1.Screen1 y el sistema llamado onNewIntent().

Cuando presiono hacia atrás, vuelve a aparecer Sceen2 y Screen1. No uso otros indicadores de intención o modos de lanzamiento.

¿Alguien podría explicar lo que está pasando ??

Respuesta

22

Android tiene TONELADAS de errores relacionados con las actividades y tareas.

Sin embargo, Google cambió el comportamiento de las tareas entre las versiones del sistema operativo y no notificó a los desarrolladores, que es lo más molesto al respecto.

jakk - Si no ha establecido ninguna bandera en los ejercicios (A o B), que el comportamiento que usted está describiendo es MAL.

Y para todos los que dicen que no hay ningún problema con la documentación, intente esto:

  1. crear una aplicación con (actividad lanzamiento) Actividad A & B (con el modo de inicio predeterminada para ambos) .
  2. Iniciar la aplicación: una tarea se crea con la actividad A solamente.
  3. Desde un botón en la actividad A, inicie la actividad B con un FLAG_ACTIVITY_NEW_TASK.
  4. Haga clic en el botón varias veces y verá que la actividad B se crea varias veces dentro de la tarea, que NO es como dice la documentación.

Existen más escenarios para demostrar que la documentación es MAL/INCORRECTA.

+10

Esto sucede porque 'taskAffinity' tiene prioridad sobre' FLAG_ACTIVITY_NEW_TASK'.Si desea que ActivityB se encuentre en una tarea diferente a ActivityA, debe darle una 'taskAffinity' diferente. Pero sí, estoy de acuerdo, hay muchos errores relacionados con actividades y tareas :-) –

+0

Según los documentos, parece que si iniciamos una actividad con intención (FLAG_NEW_TASK), y si la actividad existe en otra tarea, la tarea completa se pondrá en primer plano sobre la tarea existente. Como no hay nada especificado sobre la posición de las actividades objetivo, parece que la posición de la actividad en la pila posterior no importa. Es mi conclusión correcta? – smasher

-1

El FLAG_ACTIVITY_NEW_TASK coloca su nueva actividad en una nueva pila de tareas. Voy a referirme a las actividades como A y B.

Cuando ejecuta la primera aplicación, tiene una sola tarea con A en ella. Tarea 1 = A

Al hacer clic en la segunda actividad, se pone a B en la tarea. Tarea 1 = AB

Al hacer clic en Inicio, conserva la tarea. Tarea 1 = AB (todavía)

Al abrir la segunda aplicación y enviar la intención A con la nueva marca de tarea, se creará una NUEVA tarea con solo A en ella. Ahora tienes dos tareas. Tarea 1 = AB, Tarea 2 = A

Al desempacar esta disposición con la tecla Atrás se obtendrán 2A, 1B, 1A que es lo que está viendo. Este es el resultado esperado.

+2

No creo que se cree una nueva tarea en este caso (ya que la actividad ya existe en una tarea separada) –

+0

Esto no es cierto. Cuando ejecuta la segunda aplicación y envía A la intención A con FLAG_ACTIVITY_NEW_TASK, lleva la tarea existente al primer plano (como debería) y luego crea otra instancia de la Actividad A en esa tarea (este es el comportamiento incorrecto). No funciona como debería funcionar (o como está documentado). –

0

Esto parece estar en línea con la documentación en http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html.

FLAG_ACTIVITY_NEW_TASK es equivalente a launchMode = singleTask y allí leí

Sin embargo, si una instancia de la actividad ya existe en un tarea independiente, las rutas del sistema de la intención de la instancia existente a través de un llamar a su método onNewIntent(), en lugar de crear una nueva instancia

Iniciar la actividad sin FLAG_ACTIVITY_NEW_TASK debería darle el comportamiento esperado.

+0

¿Entonces el problema está dentro del sistema? :) – jakk

+0

por lo que puedo decir, no hay ningún problema :-) el sistema se comporta como está documentado. –

+0

Esto no es correcto. El documento. indica que se creó una nueva instancia de la actividad ** no ** y que se invoca 'onNewIntent()' en la instancia existente de la actividad. Esto no es lo que está sucediendo (en realidad se está creando una nueva instancia de la actividad **). No solo eso, si piensas en esto no tiene sentido: si tengo una tarea que contiene ActivityA con ActivityB ** en la parte superior de ActivityA **, ¿cómo puedo llamar a 'onNewIntent()' en la instancia existente de ActivityA? No es la actividad principal por lo que no puede reaccionar y para que sea la actividad más alta requeriría reordenar la pila. –

9

En su 3er paso cuando abre App2 e inicia App1.Screen1 con Intent.FLAG_ACTIVITY_NEW_TASK, también debe configurar Intent.FLAG_ACTIVITY_SINGLE_TOP para hacer lo que desee. Es un error de Android :-(

Tenga en cuenta también que el comportamiento también se rompe un poco si inicia su aplicación por primera vez desde su IDE (IntelliJ, Eclipse) o después de instalarla en el mercado (Google Play) o de una descarga navegador. Ver How to prevent multiple instances of an activity when it is launched with different intents y http://code.google.com/p/android/issues/detail?id=26658

0

FLAG_ACTIVITY_NEW_TASK

de inicio de la actividad en una nueva tarea. Si una tarea ya se está ejecutando para la actividad que ahora está comenzando, esta tarea es llevada a la primer plano con su último estado restaurado y la actividad recibe el nuevo intento en onNewIntent().

Esto produce el mismo comportamiento que el valor de launchMode "singleTask".

4

Prueba esto, me funciona. intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity (intención);