Borre toda la pila del historial y comience una nueva actividad en Android
¿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_TOP
solo funciona si la actividad ya está en la pila.
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_TASK
la bandera para borrar la tarea. Por lo tanto, también puede admitir el nivel 11 anterior a API.
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á.