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?

Author: kolistivra, 2014-02-17

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 task B, task B se apilará encima de task A. Si el usuario presiona la tecla BACK suficientes veces en task B, 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...

  1. 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 de Activity 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).
  2. 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 que Activity 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 de Activity tarea y esta tarea se coloca encima de la tarea actual (de modo que cuando Activity termine, el usuario se vuelve a colocar en la tarea actual).
  3. 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 de Activity en la raíz de la tarea y esta tarea se coloca encima de la tarea actual (de modo que cuando Activity 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...

  1. Si Activity tiene la misma afinidad de tarea que la tarea actual (es decir, la tarea desde la que se ejecuta este código) y Activity 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 de Activity, 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).
  2. Si Activity tiene la misma afinidad de tarea que la tarea actual (es decir, la tarea desde la que se ejecuta este código) y Activity es no la actividad raíz de la tarea actual, esto simplemente creará una nueva instancia de Activity 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).
  3. 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 que Activity pertenecería a) y Activity 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).
  4. 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 que Activity pertenece a) y Activityes 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 de Activity y se coloca encima de cualquier actividad existente en esa tarea.
  5. 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 de Activity en la raíz de la tarea y la nueva tarea se desacopla de la pila de tareas (de modo que cuando Activity 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...

  1. 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 de Activity 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.
  2. 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 que Activity 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 de Activity en la raíz de la tarea y esta tarea se desacopla de la pila de tareas (de modo que cuando Activity termine, el usuario regresa a la pantalla de INICIO).
  3. 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 de Activity en la raíz de la tarea y esta tarea se desacopla de la pila de tareas (de modo que cuando Activity 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)...

 85
Author: David Wasser,
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