Diferencia entre Intent.FLAG_ACTIVITY_CLEAR_TASK e Intent.FLAG_ACTIVITY_TASK_ON_HOME
En la documentación de Android:
FLAG_ACTIVITY_CLEAR_TASK
- ¿Cómo usar putExtra () con FLAG_ACTIVITY_REORDER_TO_FRONT en las aplicaciones de Android?
- Android devuelve el objeto como resultado de la actividad
- Objeto serializable en la intención que devuelve como String
- Obtener Broadcast recibir cuando la tarjeta SD está desmontando android
- Android devuelve datos a la actividad anterior
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?
- Pasar múltiples banderas a una intención en android
- La imagen adjunta de Android al correo electrónico no funciona
- Android Intent.ACTION_CALL, Uri
- Abra directamente la pantalla de clasificación Play Store de nuestra aplicación en android
- Array List Intent extra en Java
- Cómo hacer una intención con múltiples acciones
- ¿Cómo abrir un archivo sin conocer su extensión pero sabiendo su nombre completo?
- ¿Cómo detener una actividad en android usando la intención?
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 tareaB
, la tareaB
se apila encima de la tareaA
Si el usuario presiona la tecla BACK varias veces en la tareaB
, 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 …
- 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 deActivity
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). - 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íaActivity
), 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 deActivity
en la raíz de la tarea y esta tarea se coloca encima de la tarea actual (de modo que cuando laActivity
finaliza, el usuario vuelve a caer en la tarea actual). - 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 deActivity
en la raíz de la tarea y esta tarea se coloca encima de La tarea actual (de modo que cuando laActivity
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 …
- 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) 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 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). - 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) 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 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). - 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 laActivity
) yActivity
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). - 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íaActivity
) yActivity
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 DeActivity
se crea y se pone encima de las actividades existentes 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 (de modo que cuando laActivity
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 …
- 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 deActivity
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. - 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íaActivity
), 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 deActivity
en la raíz de la tarea y esta tarea se desacopla de la pila de tareas (de modo que cuando laActivity
finaliza, el usuario vuelve 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 Pila (de modo que cuando laActivity
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) …