Android: Borrar pila de actividad
Tengo varias actividades en mi aplicación. Y el flujo es muy complicado. Cuando hago clic en la aplicación Logout naviagates para acceder a la pantalla y desde allí el usuario puede salir cancelando buton (llamando a system.exit(0)
)
Cuando salgo o vuelvo el botón, el sistema invoca una actividad de la pila 🙁 ¿cómo puedo borrar todas las actividades en la pila cuando llego a la pantalla de inicio de sesión? Llamar a finish()
no es práctico ya que hay tantas actividades y algunas actividades no debe ser Cerrado cuando están activos, como la cámara nativa que invoca la actividad.
- Java / Android - ¿Cómo imprimir una traza de pila completa?
- Finalizar todas las actividades iniciadas antes de la actividad
- Android empuja una nueva actividad mientras limpia a otros
- ¿Tener demasiadas actividades afecta mi desempeño?
- Insertar androide en pila de actividad
validateuser logoutuser = new validateuser(); logoutuser.logOut(); Intent loginscreen = new Intent(homepage.this, Login2.class); (homepage.this).finish(); loginscreen.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(loginscreen);
- ¿Cómo puedo inhabilitar "volver" a alguna actividad?
- Fuera de la memoria de excepción + análisis de volcado de archivos hprof
- Pila de actividad de Android
- Android: ¿Cómo hacer que el lanzador abra siempre la actividad principal en lugar de la actividad infantil? (o de otro modo)
- Ver pila de actividades en Android
- Terminar una actividad de otra clase
- Programación de juegos para Android - Heap issues
- ¿Cómo evito que onCreate () sea llamado al iniciar una Actividad?
La mayoría de ustedes están equivocados. Si desea cerrar una pila de actividades existente, independientemente de lo que hay allí y crear una nueva raíz, el conjunto correcto de banderas es el siguiente:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
Desde el doc :
public static final int FLAG_ACTIVITY_CLEAR_TASK
Añadido en API nivel 11Si se establece en una Intención pasada a
Context.startActivity()
, este indicador hará que cualquier tarea existente que se asociaría con la actividad se borre antes de que se inicie la actividad. Es decir, la actividad se convierte en la nueva raíz de una tarea de otra manera vacía, y todas las actividades viejas están terminadas. Esto sólo se puede utilizar junto conFLAG_ACTIVITY_NEW_TASK
.
Cuando llama a startActivity
en la última actividad que siempre podría utilizar
Intent.FLAG_ACTIVITY_CLEAR_TOP
Como una bandera en esa intención.
Lea más sobre la bandera aquí .
Aquí está un método simple del ayudante para comenzar una nueva actividad como la nueva actividad superior que trabaja del nivel 4 de la API hasta la versión actual 17:
static void startNewMainActivity(Activity currentActivity, Class<? extends Activity> newTopActivityClass) { Intent intent = new Intent(currentActivity, newTopActivityClass); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) intent.addFlags(0x8000); // equal to Intent.FLAG_ACTIVITY_CLEAR_TASK which is only available from API level 11 currentActivity.startActivity(intent); }
Llámelo así de su actividad actual:
startNewMainActivity(this, MainActivity.class);
Borrar Actividad Retroceder por debajo del código:
Intent intent = new Intent(Your_Current_Activity.this, Your_Destination_Activity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK |Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
Hecho
En mi caso, LoginActivity también se cerró. Como resultado,
Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK
no ayudó.
Sin embargo,
Intent.FLAG_ACTIVITY_NEW_TASK
me ayudó.
Intent intent = new Intent(LoginActivity.this, Home.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //It is use to finish current activity startActivity(intent); this.finish();
Observé que usted pidió una solución que no confíe en el finish()
, pero me pregunto si esto puede ayudar sin embargo.
Seguí si una bandera de salida se levanta con una variable de clase estática, que sobrevive a toda la vida útil de la aplicación. En onResume()
cada actividad relevante , utilice
@Override public void onResume() { super.onResume(); if (ExitHelper.isExitFlagRaised) { this.finish(); } }
La clase ExitHelper
public class ExitHelper { public static boolean isExitFlagRaised = false; }
Digamos que en mainActivity, un usuario presiona un botón para salir – puede establecer ExitHelper.isExitFlagRaised = true;
Y luego finish()
. A partir de entonces, también se finalizarán otras actividades relevantes que se reanuden automáticamente.
- Reproducción de un tono arbitrario con Android
- Android – dibujable con esquinas redondeadas en la parte superior solamente