studio startactivity putextra intent desde boton activity abrir android android-intent

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 tarea B , la tarea B se apila en la parte superior de la tarea A Si el usuario presiona la tecla ATRÁS las veces suficientes en la tarea B , 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 ...

  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 finalizará la Activity 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).
  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 la Activity ), entonces esa tarea existente se lleva al primer plano, borrada (todas las actividades en la tarea finalizada), se crea una nueva instancia de Activity en la raíz de la tarea y esta se coloca encima de la tarea actual (de modo que cuando la Activity finalice, el usuario vuelva a la tarea actual).
  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 coloca encima de la tarea actual (para que cuando la Activity 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 ...

  1. Si Activity tiene la misma afinidad de tareas 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 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).
  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 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 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).
  3. 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 la Activity ) y Activity 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).
  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 la Activity ) y Activity 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 de Activity se crea y se pone encima de cualquier actividad existente 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 (para que cuando la Activity 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 ...

  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 finalizará la Activity y también finalizará la tarea actual (ya que solo hay 1 actividad en la tarea) y regresará al usuario a la pantalla INICIO.
  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 la Activity ), entonces esa tarea existente se lleva al primer plano, borrada (todas las actividades en la tarea finalizada), se crea una nueva instancia de Activity en la raíz de la tarea y esta se desacopla de la pila de tareas (para que cuando la Activity finalice, el usuario vuelva 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 apilar (de modo que cuando la Activity 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) ...