Borre toda la pila del historial y comience una nueva actividad en Android

Resuelto Casebash asked hace 54 años • 14 respuestas

¿Es posible iniciar una actividad en la pila y borrar todo el historial anterior?

La situación

Tengo una pila de actividades que va A->B->C o B->C (la pantalla A selecciona el token de los usuarios, pero muchos usuarios solo tienen un token).

En la pantalla C, el usuario puede realizar una acción que invalide la pantalla B, por lo que la aplicación quiere llevarlo a la pantalla A, independientemente de si ya está en la pila. La pantalla A debería ser entonces el único elemento en la pila de mi solicitud.

Notas

Hay muchas otras preguntas similares, pero no he encontrado nada que responda exactamente a esta pregunta. Intenté llamar getParent().finish(); esto siempre resulta en una excepción de puntero nulo. FLAG_ACTIVITY_CLEAR_TOPsolo funciona si la actividad ya está en la pila.

Casebash avatar Jan 01 '70 08:01 Casebash
Aceptado

En el nivel API 11 se agregó un nuevo indicador de intención solo para esto: Intent.FLAG_ACTIVITY_CLEAR_TASK

Sólo para aclarar, use esto:

Java

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

Kotlin

intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK

Desafortunadamente para API lvl <= 10, todavía no he encontrado una solución limpia para esto. La solución "DontHackAndroidLikeThis" es pura piratería. No deberías hacer eso. :)

Editar: Según el comentario de @ Ben Pearson , para API <= 10 ahora se puede usar la clase IntentCompat para lo mismo. Se puede utilizar IntentCompat.FLAG_ACTIVITY_CLEAR_TASKla bandera para borrar la tarea. Por lo tanto, también puede admitir el nivel 11 anterior a API.

Akos Cz avatar Mar 17 '2011 20:03 Akos Cz

Caso 1: Sólo dos actividades A y B:

Aquí el flujo de actividad es A->B. Al hacer clic en el botón Atrás desde B, debemos cerrar la aplicación y luego, mientras iniciamos la Actividad B desde A, simplemente llame a finalizar(), esto evitará que Android almacene la Actividad A en Backstack.por ejemplo, para la actividad A es Loding/Pantalla de presentación de la aplicación.

Intent newIntent = new Intent(A.this, B.class);
startActivity(newIntent);
finish();

Caso 2: Más de dos actividades:

Si hay un flujo como A->B->C->D->B y al hacer clic en el botón Atrás en la Actividad B mientras proviene de la Actividad D, en ese caso deberíamos usarlo.

Intent newIntent = new Intent(D.this,B.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(newIntent);

Aquí la Actividad B se iniciará desde el backstack en lugar de una nueva instancia debido a Intent.FLAG_ACTIVITY_CLEAR_TOP e Intent.FLAG_ACTIVITY_NEW_TASK borra la pila y la convierte en la superior. Entonces, cuando presionemos el botón Atrás, toda la aplicación finalizará.

monish george avatar May 03 '2013 12:05 monish george