Eliminar una actividad de la pila del historial

Resuelto Mark asked hace 54 años • 0 respuestas

Mi aplicación muestra una actividad de registro la primera vez que el usuario ejecuta la aplicación, se ve así:

  1. ActivitySplashScreen (bienvenido al juego, ¿regístrate para obtener una cuenta?)
  2. ActivitySplashScreenSignUp (genial, completa esta información)
  3. 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

Mark avatar Jan 01 '70 08:01 Mark
Aceptado

Puede lograr esto configurando el android:noHistory atributo en "true"las entradas relevantes <activity>de su AndroidManifest.xmlarchivo. Por ejemplo:

<activity
    android:name=".AnyActivity"
    android:noHistory="true" />
Aitor Gómez avatar Dec 07 '2010 12:12 Aitor Gómez

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().

Dan Lew avatar Dec 14 '2009 04:12 Dan Lew

Sí, eche un vistazo a Intent.FLAG_ACTIVITY_NO_HISTORY .

mxk avatar Dec 14 '2009 10:12 mxk

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).

Travis avatar May 13 '2011 03:05 Travis

Una forma que funciona antes de API 11 es comenzar ActivityGameMainprimero y luego, en el marco onCreatede esa Actividad, comenzar su ActivitySplashScreenactividad. No ActivityGameMainaparecerá cuando llames a startActivity demasiado pronto para el inicio.

Luego puedes borrar la pila al comenzar ActivityGameMainconfigurando 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 noHistoryen tu archivo AndroidManifest.xml. Luego, coloque el goBackPressedcódigo en su ActivitySplashScreenSignUpclase.

Sin embargo, he encontrado algunas formas de solucionar esto. Inicie otra aplicación desde una notificación mientras ActivitySplashScreenSignUpse 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);
mxcl avatar Mar 08 '2012 18:03 mxcl