¿Es posible comenzar una actividad en la pila, limpiando todo el historial antes?
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 invalida la pantalla B, por lo que la aplicación desea llevarlos a la pantalla A, independientemente de si ya está en la pila. La pantalla A debería ser el único elemento en la pila en mi aplicación.
Notas
Hay muchas otras preguntas similares, pero no he encontrado nada que responda a esta pregunta exacta. 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.
fuente
Caso 1: solo dos actividades A y B:
Aquí el flujo de actividad es A-> B. Al hacer clic en el botón Atrás de B, necesitamos cerrar la aplicación y luego al iniciar la Actividad B desde A solo llame al final (), esto evitará que Android almacene la Actividad A en Backstack.eg para que la actividad A sea Alojamiento / pantalla de inicio de la aplicación.
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 viene de la Actividad D. En ese caso, deberíamos usar.
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 primera, por lo que cuando presionamos el botón Atrás, se cerrará toda la aplicación.
fuente
Con la versión más reciente de Android> = API 16 use
finishAffinity()
El enfoque es adecuado para> = API 16.
fuente
También pasé unas horas en esto ... y estoy de acuerdo en que FLAG_ACTIVITY_CLEAR_TOP suena como lo que quieres: borra toda la pila, excepto la actividad que se inicia, por lo que el botón Atrás sale de la aplicación. Sin embargo, como mencionó Mike Repass, FLAG_ACTIVITY_CLEAR_TOP solo funciona cuando la actividad que está iniciando ya está en la pila; cuando la actividad no está allí, la bandera no hace nada.
¿Qué hacer? Coloque la actividad que se inicia en la pila con FLAG_ACTIVITY_NEW_TASK, lo que hace que esa actividad sea el inicio de una nueva tarea en la pila del historial. Luego agregue el indicador FLAG_ACTIVITY_CLEAR_TOP.
Ahora, cuando FLAG_ACTIVITY_CLEAR_TOP vaya a buscar la nueva actividad en la pila, estará allí y se detendrá antes de que se borre todo lo demás.
Aquí está mi función de cierre de sesión; El parámetro Ver es el botón al que se adjunta la función.
fuente
No deberías cambiar la pila. El botón de retroceso de Android debería funcionar como en un navegador web.
Se me ocurre una forma de hacerlo, pero es un gran truco.
Realice sus actividades
singleTask
agregándolas alAndroidManifest
ejemplo:Extienda lo
Application
que tendrá la lógica de dónde ir.Ejemplo:
De A a B:
De B a C:
C ª:
y maneje el botón Atrás
pop()
desde la pila.Una vez más, no deberías hacer esto :)
fuente
Application
toma sus instancias, el sistema operativo no podrá liberar la RAM que queda de las actividades destruidas.Inmediatamente después de comenzar una nueva actividad, usando
startActivity
, asegúrese de llamarfinish()
para que la actividad actual no se apile detrás de la nueva.fuente
Prueba esto:
fuente
Kotlin reutilizable avanzado:
Puede establecer la bandera directamente utilizando el método setter. En Kotlin se
or
encuentra el reemplazo para Java o bit a bit|
.Si planea usar esto regularmente, cree una función de extensión de intención
Luego puede llamar directamente a esta función antes de comenzar la intención
Si necesita la opción de agregar indicadores adicionales en otras situaciones, agregue un parámetro opcional a la función de extensión.
fuente
fuente
Prueba el siguiente código,
fuente
Para mí ninguno de los métodos anteriores no funciona.
Simplemente haga esto para borrar toda la actividad anterior :
fuente
A veces, su emulador de Android puede fallar al conectar la herramienta eclipse DDMS y solicitar que adb se inicie manualmente. En ese caso, puede iniciar o detener el adb utilizando el símbolo del sistema.
fuente
Encontré un hack demasiado simple, solo haga esto agregar un nuevo elemento
AndroidManifest
como: -El
android:noHistory
borrará su actividad no deseada de la pila.fuente