limpiar toda la pila de actividades android studio
Eliminar una actividad de la pila de historial (14)
En el manifiesto puedes añadir:
android:noHistory="true"
<activity
android:name=".ActivityName"
android:noHistory="true" />
También puedes llamar
finish()
Inmediatamente después de llamar a startActivity (..)
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, ¿te registras para una cuenta?)
- ActivitySplashScreenSignUp (genial, complete 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 # 2 a la # 3, ¿es posible borrar # 1 y # 2 de la pila de historial por completo? Me gustaría que si el usuario está en el # 3, y presiona el botón Atrás, simplemente vaya a la pantalla de inicio, en lugar de volver a la pantalla de bienvenida.
Creo que puedo lograr esto con tareas (es decir, comenzar una nueva tarea en el # 3) pero quería ver si había un método más simple,
Gracias
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.
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
Desde la documentación de Android:
public static final int FLAG_ACTIVITY_CLEAR_TASK Agregado en el nivel 11 de API
If set in an Intent passed to Context.startActivity(), this flag will cause any existing task that would be associated with the
Actividad a borrar antes de que comience la actividad. Es decir, la actividad se convierte en la nueva raíz de una tarea que de lo contrario está vacía y todas las actividades antiguas se terminan. Esto solo se puede utilizar junto con FLAG_ACTIVITY_NEW_TASK.
Es una locura que nadie haya mencionado esta elegante solución. Esta debería ser la respuesta aceptada.
SplashActivity -> AuthActivity -> DashActivity
if (!sessionManager.isLoggedIn()) {
Intent intent = new Intent(context, AuthActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
context.startActivity(intent);
finish();
} else {
Intent intent = new Intent(context, DashActivity.class);
context.startActivity(intent);
finish();
}
La clave aquí es usar intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
para la Activity
intermediaria. Una vez que se rompe el enlace central, DashActivity
será el primero y el último en la pila.
android:noHistory="true"
es una mala solución, ya que causa problemas al confiar en la Activity
como devolución de llamada, por ejemplo, onActivityResult
. Esta es la solución recomendada y debe ser aceptada.
Probablemente esta no sea la forma ideal de hacerlo. Si alguien tiene una mejor manera, estaré ansioso por implementarlo. Aquí es cómo logré esta tarea específica con pre-versión-11 sdk.
en cada clase que desee irse cuando sea hora clara, debe 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 desencadenar la cadena de pops de la pila necesita simplemente llamar a esto cuando desee iniciarlo:
NextActivity.this.setResult(R.string.unwind_stack_result_id);
NextActivity.this.finish();
¡Entonces las actividades no están en la pila!
Recuerde, amigos, que puede iniciar una actividad y luego comenzar a limpiar detrás de ella, la ejecución no sigue un solo hilo (el ui).
Prueba esto:
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)
es API Nivel 1, revisa el link .
Puede usar 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 a finish()
inmediatamente después de llamar a startActivity()
.
Sé que llego tarde a esto (han pasado dos años desde que se hizo la pregunta) pero lo logré al interceptar la presión del botón Atrás. En lugar de verificar actividades específicas, solo miro el conteo y, si es menos de 3, simplemente envía la aplicación a la parte posterior (pausando la aplicación y devolviendo al usuario a lo que se estaba ejecutando antes del lanzamiento). Verifico menos de tres porque solo tengo una pantalla de introducción. Además, verifico el conteo porque mi aplicación le permite al usuario navegar de regreso a la pantalla de inicio a través del menú, por lo que esto le permite hacer una copia de seguridad a través de otras pantallas como es normal si hay actividades distintas a la pantalla de introducción en la pila.
//We want the home screen to behave like the bottom of the activity stack so we do not return to the initial screen
//unless the application has been killed. Users can toggle the session mode with a menu item at all other times.
@Override
public void onBackPressed() {
//Check the activity stack and see if it''s more than two deep (initial screen and home screen)
//If it''s more than two deep, then let the app proccess the press
ActivityManager am = (ActivityManager)this.getSystemService(Activity.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasks = am.getRunningTasks(3); //3 because we have to give it something. This is an arbitrary number
int activityCount = tasks.get(0).numActivities;
if (activityCount < 3)
{
moveTaskToBack(true);
}
else
{
super.onBackPressed();
}
}
Sí, eche un vistazo a Intent.FLAG_ACTIVITY_NO_HISTORY .
Simplemente llame a esto.finish () antes de startActivity (intención) como esta-
Intent intent = new Intent(ActivityOne.this, ActivityTwo.class);
this.finish();
startActivity(intent);
Solo establece noHistory="true"
en el archivo Manifest . Hace que la actividad sea eliminada del backstack.
Una forma que funciona antes de API 11 es iniciar ActivityGameMain
primero, luego, en el onCreate
de esa actividad, inicie su actividad ActivitySplashScreen
. El ActivityGameMain
no aparecerá cuando llames a startActivity demasiado pronto para el splash.
Luego, puedes borrar la pila al iniciar ActivityGameMain
configurando estos indicadores en la Intención:
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
También debe agregar esto a ActivitySplashScreen:
@Override
public void onBackPressed() {
moveTaskToBack(true);
}
Así que al volver a presionar en esa actividad no volverá a su ActivityGameMain
.
Supongo que no desea que la pantalla de noHistory
vuelva a ninguna de las dos, para lograrlo, le sugiero que la configure en noHistory
en su AndroidManifest.xml
. Luego coloque el código goBackPressed
en su clase ActivitySplashScreenSignUp
en su lugar.
Sin embargo, he encontrado algunas maneras de romper esto. Inicie otra aplicación desde una notificación mientras se muestra ActivitySplashScreenSignUp
y el historial de respaldo no se restablece.
La única manera real de evitar esto es en API 11:
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
Yo uso de esta manera.
Intent i = new Intent(MyOldActivity.this, MyNewActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);
para API> = 15 a API 23 otra solución no funciona en mi caso. finalmente me sale este.
Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(nextScreen);
ActivityCompat.finishAffinity(currentActivity.this);
Puedes lograr esto configurando el atributo android:noHistory
en "true"
en las entradas relevantes de <activity>
en tu archivo AndroidManifest.xml
. Por ejemplo:
<activity
android:name=".AnyActivity"
android:noHistory="true" />