toda studio pila limpiar actividades android android-activity activity-lifecycle

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í:

  1. ActivitySplashScreen (bienvenido al juego, ¿te registras para una cuenta?)
  2. ActivitySplashScreenSignUp (genial, complete 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 # 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(); } }



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" />