startactivity - putextra android
Diferencia entre Intent.FLAG_ACTIVITY_CLEAR_TASK e Intent.FLAG_ACTIVITY_TASK_ON_HOME (1)
De la documentación de Android:
FLAG_ACTIVITY_CLEAR_TASK
Si se establece en un Intento pasado a Context.startActivity (), este indicador hará que cualquier tarea existente que esté asociada con la actividad se borre antes de que se inicie la actividad. Es decir, la actividad se convierte en la nueva raíz de una tarea que, de otro modo, estaría vacía, y todas las actividades anteriores finalizarán. Esto solo se puede usar junto con FLAG_ACTIVITY_NEW_TASK.
y
FLAG_ACTIVITY_TASK_ON_HOME
Si se establece en un Intento pasado a Context.startActivity (), este indicador hará que se coloque una nueva tarea de inicio en la parte superior de la tarea de actividad actual (si hay una). Es decir, al volver atrás de la tarea, el usuario regresará siempre a casa, incluso si esa no fue la última actividad que vieron. Esto solo se puede usar junto con FLAG_ACTIVITY_NEW_TASK.
Considere estos dos fragmentos:
Intent intent = new Intent(this, Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
y
Intent intent = new Intent(this, Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
startActivity(intent);
Como entiendo, en cualquier fragmento de código creamos una nueva tarea que solo tiene Actividad en ella, y cuando presiona hacia atrás, va a la pantalla de inicio. Suponiendo que estoy probablemente equivocado, ¿cuáles son las diferencias entre los dos? Además, si tuviera otro fragmento con Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME | Intent.FLAG_ACTIVITY_CLEAR_TASK
Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME | Intent.FLAG_ACTIVITY_CLEAR_TASK
Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME | Intent.FLAG_ACTIVITY_CLEAR_TASK
¿cómo se comportaría?
Hay una diferencia entre los 2 fragmentos. Aquí hay algunos antecedentes importantes:
Una tarea contiene una pila de actividades. Una tarea puede estar en primer plano o en segundo plano.
Las tareas también están "apiladas". Si está en la tarea
A
y comienza una nueva tareaB
, la tareaB
se apila en la parte superior de la tareaA
Si el usuario presiona la tecla ATRÁS las veces suficientes en la tareaB
, finalmente terminará de nuevo en la tarea `A. Este es el comportamiento estándar de Android.
Tu fragmento ...
Intent intent = new Intent(this, Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
... hará 1 de las siguientes cosas, dependiendo ...
- Si
Activity
tiene la misma afinidad de tarea que la tarea actual (es decir, la tarea desde la que se ejecuta este código), borrará la tarea actual (finalizará todas las actividades de la tarea) y lanzará una nueva instancia deActivity
en la tarea actual. Si el usuario presiona la tecla ATRÁS, esto finalizará laActivity
y también finalizará la tarea actual (ya que solo hay 1 actividad en la tarea) y devolverá al usuario a la pantalla INICIO o a la tarea que inició esta tarea (la tarea que está debajo de esta tarea en la pila de tareas). - Si la
Activity
tiene una afinidad de tarea diferente a la tarea actual, y ya existe una tarea existente con esa afinidad de tarea (es decir, una tarea existente a la que pertenecería laActivity
), entonces esa tarea existente se lleva al primer plano, borrada (todas las actividades en la tarea finalizada), se crea una nueva instancia deActivity
en la raíz de la tarea y esta se coloca encima de la tarea actual (de modo que cuando laActivity
finalice, el usuario vuelva a la tarea actual). - Si la
Activity
tiene una afinidad de tarea diferente a la tarea actual, y no hay una tarea existente con esa afinidad de tarea, se crea una nueva tarea y se crea una nueva instancia deActivity
en la raíz de la tarea y esta tarea se coloca encima de la tarea actual (para que cuando laActivity
finalice, el usuario vuelva a la tarea actual).
Este fragmento de código ...
Intent intent = new Intent(this, Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
startActivity(intent);
... hará 1 de las siguientes cosas dependiendo ...
- Si
Activity
tiene la misma afinidad de tareas que la tarea actual (es decir, la tarea desde la que se ejecuta este código) yActivity
es la actividad raíz de la tarea actual, esto no hará nada. No iniciará una nueva tarea, no borrará ninguna actividad, no creará una nueva instancia deActivity
, y no cambiará el comportamiento de lo que sucede cuando la tarea actual está terminada (es decir: si se inició la tarea actual). con otra tarea, cuando finalicen todas las actividades de la tarea actual, volverá a colocar al usuario en la tarea anterior en la pila de tareas). - Si
Activity
tiene la misma afinidad de tarea que la tarea actual (es decir, la tarea desde la que se ejecuta este código) yActivity
no es la actividad raíz de la tarea actual, esto simplemente creará una nueva instancia deActivity
y la colocará encima de la actividad actual en la tarea actual. No iniciará una nueva tarea, no borrará ninguna actividad y no cambiará el comportamiento de lo que sucede cuando la tarea actual finaliza (es decir, si la tarea actual fue iniciada por otra tarea, cuando todas las actividades en la actualidad la tarea ha finalizado, volverá a colocar al usuario en la tarea anterior en la pila de tareas). - Si la
Activity
tiene una afinidad de tarea diferente a la tarea actual, y ya existe una tarea existente con esa afinidad de tarea (es decir, una tarea existente a la que pertenecería laActivity
) yActivity
es la actividad raíz de esa tarea existente, entonces esa tarea existente se pone en primer plano y esa tarea se desacopla de la pila de tareas (es decir, cuando todas las actividades en esa tarea hayan finalizado, devolverá al usuario a la pantalla INICIO y no a la tarea que inició esa tarea). - Si la
Activity
tiene una afinidad de tarea diferente a la tarea actual, y ya existe una tarea existente con esa afinidad de tarea (es decir, una tarea existente a la que pertenecería laActivity
) yActivity
no es la actividad raíz de esa tarea existente, entonces la existente la tarea se pone en primer plano y esa tarea se desacopla de la pila de tareas (es decir, cuando finalicen todas las actividades en esa tarea, devolverá al usuario a la pantalla INICIO y no a la tarea que inició esa tarea) y una nueva instancia deActivity
se crea y se pone encima de cualquier actividad existente en esa tarea. - Si la
Activity
tiene una afinidad de tarea diferente a la tarea actual, y no hay una tarea existente con esa afinidad de tarea, se crea una nueva tarea y se crea una nueva instancia deActivity
en la raíz de la tarea y la nueva tarea se desacopla de la pila de tareas (para que cuando laActivity
finalice, el usuario vuelva a la pantalla de inicio y no a la tarea que la inició).
y finalmente, este fragmento ...
Intent intent = new Intent(this, Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
startActivity(intent);
... hará 1 de las siguientes cosas, dependiendo ...
- Si
Activity
tiene la misma afinidad de tarea que la tarea actual (es decir, la tarea desde la que se ejecuta este código), borrará la tarea actual (finalizará todas las actividades de la tarea) y lanzará una nueva instancia deActivity
en la tarea actual. Si el usuario presiona la tecla ATRÁS, esto finalizará laActivity
y también finalizará la tarea actual (ya que solo hay 1 actividad en la tarea) y regresará al usuario a la pantalla INICIO. - Si la
Activity
tiene una afinidad de tarea diferente a la tarea actual, y ya existe una tarea existente con esa afinidad de tarea (es decir, una tarea existente a la que pertenecería laActivity
), entonces esa tarea existente se lleva al primer plano, borrada (todas las actividades en la tarea finalizada), se crea una nueva instancia deActivity
en la raíz de la tarea y esta se desacopla de la pila de tareas (para que cuando laActivity
finalice, el usuario vuelva a la pantalla INICIO). - Si la
Activity
tiene una afinidad de tarea diferente a la tarea actual, y no hay una tarea existente con esa afinidad de tarea, se crea una nueva tarea y se crea una nueva instancia deActivity
en la raíz de la tarea y esta tarea se desacopla de la tarea apilar (de modo que cuando laActivity
finalice, el usuario vuelva a la pantalla INICIO).
Me doy cuenta de que esta respuesta es larga y complicada, pero hay muchos casos diferentes. Probablemente ni siquiera he cubierto todos los casos posibles (por ejemplo, si Activity
tiene un modo de lanzamiento especial) ...