android android-intent android-activity stack clear

Android: Borrar la pila trasera



android-intent android-activity (30)

En Android tengo algunas actividades, digamos A, B, C.

En AI usa este código para abrir B:

Intent intent = new Intent(this, B.class); startActivity(intent);

En BI use este código para abrir C:

Intent intent = new Intent(this, C.class); startActivity(intent);

Cuando el usuario pulsa un botón en CI, quiere volver a A y borrar la pila trasera (cierre B y C). Entonces, cuando el usuario use el botón de retroceso B y C no se mostrará, he estado intentando lo siguiente:

Intent intent = new Intent(this, A.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);

Pero B y C siguen apareciendo si uso el botón Atrás cuando vuelvo a la actividad A. ¿Cómo puedo evitar esto?


  1. Agregue android:launchMode="singleTop" al elemento de actividad en su manifiesto para la Actividad A
  2. Luego use intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) e intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) al iniciar la Actividad A

Esto significa que cuando se inicia la Actividad A, todas las tareas encima de ella se borran para que A esté arriba. Se crea una nueva pila trasera con A en la raíz, y el uso de singleTop garantiza que solo se inicie A una vez (ya que A está en la parte superior debido a ..._CLEAR_TOP ).


¿Qué hay de agregar en el archivo de manifiestos para la actividad relacionada:

android:noHistory="true"

a la definición de actividad de B y C? No se añadirán a la contraportada. No estoy seguro si eso es lo que quieres.


Además de FLAG_ACTIVITY_CLEAR_TOP , también puedes intentar agregar Intent.FLAG_ACTIVITY_SINGLE_TOP :

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);


Agregue NO bandera de historial en la intención.

En la actividad B, inicie la actividad C de la siguiente manera >>>>>>

Intent intent = new Intent(this, C.class); intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(intent); finish();


Agregue esto a su Activity B y Activity C

android:noHistory="true"

o Override función onBackPressed para evitar volver a presionar con un return .

@Override public void onBackPressed() { return; }



El código dado funciona correctamente. Lo he intentado en la muestra Ciclo de vida de la aplicación.

No tengo B y C en la pila posterior después de comenzar la actividad A con el indicador, FLAG_ACTIVITY_CLEAR_TOP


En manifiesto

android:launchMode="singleTask"

y

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);


Encontré las respuestas aquí un poco confusas porque el código en la pregunta original parece funcionar bien para mí?

Dado que A es la actividad raíz, iniciarla desde B o C solo con FLAG_ACTIVITY_CLEAR_TOP elimina B y C de la pila trasera.


Encontré una solución interesante que podría ayudar. Hice esto en mi método onBackPressed() .

finishAffinity(); finish();

FinishAffinity elimina la conexión de la actividad existente a su pila. Y luego terminar te ayuda a salir de esa actividad. Lo que eventualmente saldrá de la aplicación.


Esta es una respuesta muy antigua y no encontré una solución adecuada, con el único propósito de limpiar el backStack, decidí crear mi propio backstack, que no es ni una pila de tbh, pero no tiene ser, ya que queremos borrar todo en él de todos modos;

Hay una sobrecarga de handstind el backstack cada vez, pero me dio el control que necesitaba;

Primero declare una lista pública de actividades (o fragmentos, lo que necesite);

public static ArrayList <Activity> backStack = new ArrayList<>();

Y dentro del método onCreate de todas las demás actividades:

MainActivity.backStack.add(this);

Y, por último, cuando desee eliminar el backstack, simplemente llame:

public static void killBackStack () { for (Activity ac : backStack) { if (ac != null) ac.finish(); } }


Esto me funcionó con onBackPressed:

public void onBackPressed() { Intent intent = new Intent(ImageUploadActivity.this, InputDataActivity.class); Intent myIntent = new Intent(this, ImageUploadActivity.class); myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); finish(); }


Esto me molesta por mucho tiempo. Finalmente, lo resolví haciendo esto:

En el fragmento, use:

Intent intent = new Intent(view.getContext(), A.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);

En Actividad, use (agregue un indicador de intento más. Intent.FLAG_ACTIVITY_CLEAR_TASK comparado con el fragmento):

Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);


Intenta usar

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

y no

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);


Intente agregar FLAG_ACTIVITY_NEW_TASK como se describe en los documentos para FLAG_ACTIVITY_CLEAR_TOP :

Este modo de inicio también se puede utilizar con éxito junto con FLAG_ACTIVITY_NEW_TASK: si se usa para iniciar la actividad raíz de una tarea, llevará a primer plano cualquier instancia actualmente en ejecución de esa tarea, y luego la borrará a su estado raíz. Esto es especialmente útil, por ejemplo, al iniciar una actividad desde el administrador de notificaciones.

Entonces tu código para lanzar A sería:

Intent intent = new Intent(this, A.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); finish(); // call this to finish the current activity


Llamé a activity_name.this.finish() después de comenzar una nueva intención y funcionó para mí.

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

Pero no funcionará para mí ... No estoy sugiriendo esta solución para su uso, pero si configurar el indicador no funcionará para usted, entonces puede intentarlo ... Pero aún así, recomiendo que no lo use


Me parece que necesitas comenzar la Activity C de la Activity B usando startActivityForResult() . Cuando hace clic en un botón en la Activity C , llame a setResult(RESULT_OK) y finish() para que la Activity C termine. En la Activity B , puede hacer que onActivityResult() responda llamando también a finish() en sí mismo, y luego volverá a la Activity A


Para futuras investigaciones, pruebe este código.

Intent intent = new Intent(context, LoginActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); finish();


Probé todas las soluciones y ninguna funcionó individualmente para mí. Mi solución es:

Declare la Activity A como SingleTop usando [android:launchMode="singleTop"] en el manifiesto de Android.

Ahora agregue las siguientes banderas mientras lanza A desde cualquier lugar. Se borrará la pila.

Intent in = new Intent(mContext, A.class); in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK ); startActivity(in); finish();


Puedes usar este ejemplo para llamar a tu Activity A de la Activity C

Intent loout = new Intent(context, LoginActivity.class); loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(loout);


Según Wakka en Eliminar una actividad de la pila de historial ...

Agregue el android:noHistory="true" a su <activity> en el AndroidManifest.xml esta manera:

<activity android:name=".MyActivity" android:noHistory="true"> </activity>


Si su aplicación tiene un mínimo de sdk versión 16, entonces puede usar finishAffinity ()

Termine esta actividad así como todas las actividades inmediatamente debajo de ella en la tarea actual que tienen la misma afinidad.

Esto es trabajo para mí. En la pantalla Top Payment, elimine todas las actividades de back-stack,

@Override public void onBackPressed() { finishAffinity(); startActivity(new Intent(PaymentDoneActivity.this,Home.class)); }

http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29


Utilice finishAffinity (); en la tarea C al iniciar la tarea A para borrar las actividades de backstack.


logout.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TASK); logout.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);


use este código para iniciar una nueva actividad y cierre o destruya todas las demás pilas de actividad o satack posterior ...

Intent intent = new Intent(this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent);


Intent.FLAG_ACTIVITY_CLEAR_TOP no funcionará en este caso. Utilice (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)

Para más detalles por favor revisa this documentación.


Use el método setFlags () para despejar el lado abierto, cierre todas las actividades y comience su actividad.

Intent intent = new Intent(getApplicationContext(), yourActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent);


Intent intent = new Intent(this, A.class); startActivity(intent); finish();


Use finishAffinity() to clear all backstack with existing one. Suppose, Activities A, B and C are in stack, and finishAffinity(); is called in Activity C, - Activity B will be finished / removing from stack. - Activity A will be finished / removing from stack. - Activity C will finished / removing from stack.


intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent);