Diferencia entre Intención.MARCAR ACTIVIDAD BORRAR TAREA e Intención.MARCAR ACTIVIDAD TAREA EN INICIO
De la documentación de Android:
FLAG_ACTIVITY_CLEAR_TASK
Si se establece en una Intent pasada al Contexto.startActivity (), este indicador hacer que cualquier tarea existente que esté asociada con la actividad se borra antes de que se inicie la actividad. Es decir, la actividad se convierte en la nueva raíz de una tarea vacía, y cualquier las actividades han terminado. Esto solo se puede usar junto con FLAG_ACTIVITY_NEW_TASK.
Y
FLAG_ACTIVITY_TASK_ON_HOME
Si se establece en una Intent pasada al Contexto.startActivity (), este indicador hacer que una tarea de lanzamiento reciente se coloque en la parte superior de la página de inicio actual actividad tarea (si la hay). Es decir, presionando hacia atrás de la tarea siempre devolverá al usuario a casa, incluso si no fue el último 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);
Según entiendo, en cualquier fragmento de código creamos una nueva tarea que solo tiene Actividad en ella, y cuando presiona atrás, va a la pantalla de inicio. Suponiendo que probablemente me equivoque, ¿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
¿cómo se comportaría?
1 answers
Hay una diferencia entre los 2 fragmentos. He aquí 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 se "apilan". Si está en task
A
y comienza una nueva taskB
, taskB
se apilará encima de taskA
. Si el usuario presiona la tecla BACK suficientes veces en taskB
, eventualmente terminará de nuevo en task ' A. Este es el Android estándar comportamiento.
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 terminaráActivity
y también terminará la tarea actual (ya que solo hay 1 actividad en la tarea) y devuelve al usuario a la pantalla de INICIO o a la tarea que inició esta tarea (la tarea que está debajo de esta tarea en la pila de tareas). - Si
Activity
tiene una afinidad de tarea diferente a la tarea actual, y ya hay una tarea existente con esa afinidad de tarea (es decir, una tarea existente a la queActivity
pertenecería), entonces esa tarea existente se lleva al primer plano, se borra (todas las actividades de la tarea están terminadas), se crea una nueva instancia deActivity
tarea y esta tarea se coloca encima de la tarea actual (de modo que cuandoActivity
termine, el usuario se vuelve a colocar en la tarea actual). - Si
Activity
tiene una afinidad de tarea diferente a la tarea actual, y no hay ninguna 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 (de modo que cuandoActivity
termine, el usuario se tarea).
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 tarea 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 el la tarea actual ha terminado (es decir: si la tarea actual fue iniciada por otra tarea, cuando todas las actividades de la tarea actual hayan terminado, el usuario volverá a caer 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
es no la actividad raíz de la tarea actual, esto simplemente creará una nueva instancia deActivity
y la pondrá 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 está terminada (es decir: si la tarea actual fue iniciada por otra tarea, cuando todas las actividades de la tarea actual están terminadas, volverá a colocar al usuario en la tarea anterior en la pila de tareas). - Si
Activity
tiene una afinidad de tarea diferente a la tarea actual, y ya hay una tarea existente con esa afinidad de tarea (es decir: una tarea existente queActivity
pertenecería a) yActivity
es la actividad raíz de esa tarea existente, entonces esa tarea existente se lleva al primer plano y esa tarea se desacopla de la pila de tareas (es decir: cuando todas las actividades de esa tarea se terminan, devolverá al usuario a la pantalla de INICIO y no a la tarea que inició esa tarea). - Si
Activity
tiene una afinidad de tarea diferente a la tarea actual, y ya hay una tarea existente con esa afinidad de tarea (es decir: una tarea existente queActivity
pertenece a) yActivity
es nola actividad raíz de esa tarea existente, entonces esa tarea existente se lleva al primer plano y esa tarea se desacopla de la pila de tareas (es decir, cuando todas las actividades de esa tarea se terminan, devolverá al usuario a la pantalla DE INICIO y no a la tarea que inició esa tarea) y se crea una nueva instancia deActivity
y se coloca encima de cualquier actividad existente en esa tarea. - Si
Activity
tiene una afinidad de tarea diferente a la actual tarea, y no hay 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 (de modo que cuandoActivity
finaliza, el usuario regresa 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 tareas como 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 terminaráActivity
y también terminará la tarea actual (ya que solo hay 1 actividad en la tarea) y devolverá al usuario a la pantalla de INICIO. - Si
Activity
tiene una afinidad de tarea diferente a la tarea actual, y ya hay una tarea existente con esa tarea afinidad (es decir: una tarea existente a la queActivity
pertenecería), entonces esa tarea existente se lleva al primer plano, se borra (todas las actividades de la tarea han terminado), se crea una nueva instancia deActivity
en la raíz de la tarea y esta tarea se desacopla de la pila de tareas (de modo que cuandoActivity
termine, el usuario regresa a la pantalla de INICIO). - Si
Activity
tiene una afinidad de tarea diferente a la tarea actual, y no hay 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 pila de tareas (de modo que cuandoActivity
termine, el usuario regresa a la pantalla de 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)...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-10 16:02:11