Eliminar una actividad de la pila del historial
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, ¿regístrate para obtener una cuenta?)
- ActivitySplashScreenSignUp (genial, completa esta información)
- ActivityGameMain (pantalla principal del juego)
de modo que 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 completamente los números 1 y 2 de la pila del 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 regresar 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
Puede lograr esto configurando el android:noHistory
atributo en "true"
las entradas relevantes <activity>
de su AndroidManifest.xml
archivo. Por ejemplo:
<activity
android:name=".AnyActivity"
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ás haciendo es llamar finish()
inmediatamente después de llamar startActivity()
.
Sí, eche un vistazo a Intent.FLAG_ACTIVITY_NO_HISTORY .
Probablemente esta no sea la forma ideal de hacerlo. Si alguien tiene una forma mejor, estaré deseando implementarla. Así es como logré esta tarea específica con el SDK anterior a la versión 11.
En cada clase que quieras irte cuando sea el momento claro, debes hacer esto:
... interesting code stuff ...
Intent i = new Intent(MyActivityThatNeedsToGo.this, NextActivity.class);
startActivityForResult(i, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == R.string.unwind_stack_result_id) {
this.setResult(R.string.unwind_stack_result_id);
this.finish();
}
}
entonces el que necesita activar la cadena de pops de la pila necesita simplemente llamar a esto cuando quiera iniciarlo:
NextActivity.this.setResult(R.string.unwind_stack_result_id);
NextActivity.this.finish();
¡Entonces las actividades no están en la pila!
Recuerden amigos, que pueden iniciar una actividad y luego comenzar a limpiar detrás de ella, la ejecución no sigue un solo hilo (la interfaz de usuario).
Una forma que funciona antes de API 11 es comenzar ActivityGameMain
primero y luego, en el marco onCreate
de esa Actividad, comenzar su ActivitySplashScreen
actividad. No ActivityGameMain
aparecerá cuando llames a startActivity demasiado pronto para el inicio.
Luego puedes borrar la pila al comenzar ActivityGameMain
configurando estas banderas en el Intent:
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
También debes agregar esto a ActivitySplashScreen:
@Override
public void onBackPressed() {
moveTaskToBack(true);
}
Para que presionar nuevamente esa actividad no regrese a tu ActivityGameMain
.
Supongo que tampoco quieres que vuelva a aparecer la pantalla de inicio; para lograrlo, te sugiero configurarla noHistory
en tu archivo AndroidManifest.xml
. Luego, coloque el goBackPressed
código en su ActivitySplashScreenSignUp
clase.
Sin embargo, he encontrado algunas formas de solucionar esto. Inicie otra aplicación desde una notificación mientras ActivitySplashScreenSignUp
se muestra y el historial anterior no se restablece.
La única forma real de solucionar esto es en API 11:
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);