Mi aplicación muestra una actividad de registro la primera vez que el usuario ejecuta la aplicación, se ve así:
- ActivitySplashScreen (bienvenido al juego, ¿registrarse para obtener una cuenta?)
- ActivitySplashScreenSignUp (genial, complete esta información)
- ActivityGameMain (pantalla principal del juego)
entonces las actividades se inician entre sí exactamente en ese orden, cuando el usuario hace clic en un botón en cada pantalla.
Cuando el usuario pasa de la actividad n. ° 2 a la n. ° 3, ¿es posible borrar por completo el n. ° 1 y n. ° 2 de la pila de historial? Me gustaría que si el usuario está en el n. ° 3 y presiona el botón Atrás, simplemente vaya a la pantalla de inicio, en lugar de volver a la pantalla de inicio.
Creo que puedo lograr esto con tareas (es decir, comenzar una nueva tarea en el n. ° 3) pero quería ver si había un método más simple,
Gracias
Respuestas:
Esto se puede conseguir ajustando el
android:noHistory
atributo que"true"
en las correspondientes<activity>
entradas en elAndroidManifest.xml
archivo. Por ejemplo:fuente
FLAG_ACTIVITY_NO_HISTORY
.android:noHistory="true"
Puede utilizar el reenvío para eliminar la actividad anterior de la pila de actividades mientras inicia la siguiente. Hay un ejemplo de esto en APIDemos , pero básicamente todo lo que está haciendo es llamar
finish()
inmediatamente después de llamarstartActivity()
.fuente
FLAG_ACTIVITY_CLEAR_TOP
no funcionará porque C aún no está en la pila trasera.Sí, eche un vistazo a Intent.FLAG_ACTIVITY_NO_HISTORY .
fuente
android:noHistory="true"
en el manifiesto.intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
para configurar esta bandera.Probablemente esta no sea la forma ideal de hacerlo. Si alguien tiene una mejor manera, espero poder implementarla. Así es como realicé esta tarea específica con la versión previa 11 sdk.
en cada clase que quiera irse cuando sea hora clara, debe hacer esto:
entonces el que necesita desencadenar la cadena de estallidos de la pila solo debe llamar a esto cuando desee iniciarlo:
¡Entonces las actividades no están en la pila!
Recuerde, amigos, que pueden comenzar una actividad y luego comenzar a limpiar detrás de ella, la ejecución no sigue un solo hilo (la interfaz de usuario).
fuente
Una forma que funciona antes de API 11 es comenzar
ActivityGameMain
primero, luego, enonCreate
esa Actividad, inicie suActivitySplashScreen
actividad. ElActivityGameMain
no aparecerá como se llama a startActivity demasiado pronto para el chapoteo.Luego puede borrar la pila al comenzar
ActivityGameMain
estableciendo estos indicadores en la intención:También debe agregar esto a ActivitySplashScreen:
De modo que presionar hacia atrás en esa actividad no vuelve a su
ActivityGameMain
.Supongo que no desea que la pantalla de bienvenida vuelva a tampoco, para lograr esto, sugiero configurarlo
noHistory
en suAndroidManifest.xml
. Luego ponga elgoBackPressed
código en suActivitySplashScreenSignUp
clase en su lugar.Sin embargo, he encontrado algunas formas de romper esto. Inicie otra aplicación desde una notificación mientras
ActivitySplashScreenSignUp
se muestra y el historial no se restablece.La única forma real de evitar esto es en API 11:
fuente
Yo uso de esta manera.
fuente
Sé que llegué tarde a esto (han pasado dos años desde que se hizo la pregunta) pero lo logré interceptando la presión del botón Atrás. En lugar de buscar actividades específicas, solo miro el recuento y si es inferior a 3, simplemente envía la aplicación a la parte posterior (pausa la aplicación y devuelve al usuario lo que se estaba ejecutando antes del lanzamiento). Compruebo menos de tres porque solo tengo una pantalla de introducción. Además, verifico el recuento porque mi aplicación permite al usuario navegar de regreso a la pantalla de inicio a través del menú, por lo que esto les permite retroceder a través de otras pantallas como de costumbre si hay actividades distintas a la pantalla de introducción en la pila.
fuente
En el manifiesto puedes agregar:
Tambien puedes llamar
inmediatamente después de llamar a startActivity (..)
fuente
Solo configúrelo
noHistory="true"
en el archivo de manifiesto . Hace que la actividad se elimine del backstack.fuente
Es una locura que nadie haya mencionado esta elegante solución. Esta debería ser la respuesta aceptada.
SplashActivity -> AuthActivity -> DashActivity
La clave aquí es usar
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
para el intermediarioActivity
. Una vez que se rompe el enlace del medio, laDashActivity
voluntad será la primera y la última en la pila.android:noHistory="true"
es una mala solución, ya que causa problemas al confiar en elActivity
como una devolución de llamada, por ejemploonActivityResult
. Esta es la solución recomendada y debe ser aceptada.fuente
Es demasiado tarde, pero espero que ayude. La mayoría de las respuestas no apuntan en la dirección correcta. Hay dos banderas simples para tal cosa.
Desde documentos de Android:
fuente
Simplemente llame a this.finish () antes de startActivity (intent) como este:
fuente
La eliminación de una actividad de un historial se realiza al establecer el indicador antes de la actividad que no desea
A-> B-> C-> D
Suponga que A, B, C y D son 4 actividades si desea borrar B y C, luego establezca el indicador
En la actividad A y B
Aquí está el bit de código
fuente
fuente
Prueba esto:
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)
es API Nivel 1, verifique el enlace .
fuente
Intent.FLAG_ACTIVITY_NO_HISTORY
?