Diferencia entre Intent.FLAG_ACTIVITY_CLEAR_TASK e Intent.FLAG_ACTIVITY_TASK_ON_HOME

En la documentación de Android:

FLAG_ACTIVITY_CLEAR_TASK

Si se establece en una Intención pasada a Context.startActivity (), este indicador hará que cualquier tarea existente que se asociaría 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 de otra manera vacía, y todas las actividades viejas están terminadas. Esto sólo se puede utilizar 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 una tarea de lanzamiento se coloque en la parte superior de la tarea de actividad principal actual (si existe). Es decir, presionando hacia atrás de la tarea siempre devolverá al usuario a casa incluso si esa no era la última actividad que vieron. Esto sólo se puede utilizar 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); 

De la manera que entiendo, en cualquier fragmento de código creamos una nueva tarea que tiene sólo Actividad en ella, y al pulsar de nuevo, ir a la pantalla de inicio. Suponiendo que probablemente estoy 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 se "apilan". Si está en la tarea A y comienza una nueva tarea B , la tarea B se apila encima de la tarea A Si el usuario presiona la tecla BACK varias veces en la tarea B , finalmente terminará en la tarea `A. Este es el comportamiento estándar de Android.

Su fragmento …

 Intent intent = new Intent(this, Activity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); 

… hará una de las siguientes cosas, dependiendo …

  1. Si Activity tiene la misma afinidad de tarea que la tarea actual (es decir: la tarea desde la cual este código se está ejecutando), 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 BACK, esto terminará Activity y también finalizará la tarea actual (ya que sólo hay una actividad en la tarea) y devolverá al usuario a la pantalla HOME o la tarea que inició esta tarea Debajo de esta tarea en la pila de tareas).
  2. 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 Activity ), entonces esa tarea existente se pone en primer plano, se borra (todas las actividades En la tarea se ha finalizado), 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 la Activity finaliza, el usuario vuelve a caer en la tarea actual).
  3. Si la 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 coloca encima de La tarea actual (de modo que cuando la Activity termine, el usuario vuelva a caer en 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á una de las siguientes cosas dependiendo …

  1. Si Activity tiene la misma afinidad de tarea que la tarea actual (es decir: la tarea desde la cual este código se está ejecutando) 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 se termina la tarea actual (por ejemplo: si se inició la tarea actual Por otra tarea, cuando todas las actividades de la tarea actual estén terminadas, el usuario volverá a la tarea anterior de la pila de tareas).
  2. Si Activity tiene la misma afinidad de tarea que la tarea actual (es decir, la tarea desde la cual este código se está ejecutando) y Activity no es la actividad raíz de la tarea actual, esto simplemente creará una nueva instancia de Activity 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 se termina la tarea actual (es decir: si la tarea actual fue iniciada por otra tarea, cuando todas las actividades de la actual Tarea está terminado, se dejará caer al usuario de nuevo en la tarea anterior en la pila de tareas).
  3. Si la Activity tiene una afinidad de tarea diferente de la actual, y ya hay una tarea existente con esa afinidad de tarea (es decir: una tarea existente a la que pertenecería la Activity ) y Activity es la actividad raíz de esa tarea existente, entonces esa tarea existente Se pone en primer plano y esta tarea se desacopla de la pila de tareas (es decir: cuando todas las actividades en esa tarea están terminadas, devolverá al usuario a la pantalla HOME y no a la tarea que inició esa tarea).
  4. 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 Activity ) y Activity no es la actividad raíz de esa tarea existente, La tarea se pone en primer plano y esa tarea se desacopla de la pila de tareas (es decir, cuando todas las actividades de esa tarea están terminadas, devolverá al usuario a la pantalla HOME y no a la tarea que inició esa tarea) y una nueva instancia De Activity se crea y se pone encima de las actividades existentes en esa tarea.
  5. 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 de Activity en la raíz de la tarea y la nueva tarea se desacopla de la Pila de tareas (de modo que cuando la Activity finaliza, el usuario vuelve a la pantalla HOME y no a la tarea que lo 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á una de las siguientes cosas, dependiendo …

  1. Si Activity tiene la misma afinidad de tarea que la tarea actual (es decir: la tarea desde la cual este código se está ejecutando), 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 pulsa la tecla BACK, esto terminará Activity y también finalizará la tarea actual (ya que sólo hay una actividad en la tarea) y devolverá al usuario a la pantalla HOME.
  2. 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 Activity ), entonces esa tarea existente se pone en primer plano, se borra (todas las actividades En la tarea se ha 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 la Activity finaliza, el usuario vuelve a la pantalla INICIO).
  3. 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 de Activity en la raíz de la tarea y esta tarea se desacopla de la tarea Pila (de modo que cuando la Activity termine, el usuario regrese a la pantalla HOME).

Me doy cuenta de que esta respuesta es larga y complicada, pero hay tantos casos diferentes. Probablemente ni siquiera he cubierto todos los casos posibles (por ejemplo, si Activity tiene un modo de inicio especial) …

  • Android Cámara de visión de superficie cámara recreada cuando presiono botón de nuevo en la tableta de Archos en jellybean
  • No se puede encontrar la clase de símbolo Intent
  • onClick () confusión de eventos con el parámetro
  • El intento de correo electrónico no funciona
  • Synchronous startActivityForResult - Esperando que la actividad se complete
  • Cómo iniciar la actividad con FLAG_REORDER_TO_FRONT y FLAG_CLEAR_TOP
  • Problema con la Iniciativa Web de Android
  • Intent.FLAG_ACTIVITY_CLEAR_TOP no elimina la pila de actividades
  • Pasar ArrayLists en Android
  • Android contenido activitynotfoundexception no activity found to handle intent - al intentar ir a url
  • Convertir un sitio web en una aplicación de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.