Android: borre la stack posterior

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

En AI, use 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 toca un botón en CI quiere regresar a A y borrar la stack posterior (cerrar B y C). Entonces, cuando el usuario usa el botón Atrás B y C no aparece, 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 utilizo el botón Atrás cuando estoy de nuevo en actividad A. ¿Cómo puedo evitar esto?

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

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

Entonces, su código para iniciar 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 
 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); 

¿Qué tal si agregas un archivo de manifiestos para una actividad relacionada?

 android:noHistory="true" 

a la definición de actividad de B y C? No serán agregados a la backstack. No estoy seguro si eso es lo que quieres.

Esto me molesta por mucho tiempo. Finalmente lo resolví al hacer esto:

En 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 intención más Intent.FLAG_ACTIVITY_CLEAR_TASK comparación 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); 
  1. Agregue android:launchMode="singleTop" al elemento de actividad en su manifiesto para la actividad A
  2. A continuación, utilice intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) y intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) al iniciar la Actividad A

Esto significa que cuando se inicia la Actividad A, todas las tareas que se encuentran encima se borran para que A esté arriba. Se crea una nueva stack de respaldo con A en la raíz, y el uso de singleTop garantiza que solo se ejecute A una vez (ya que A está ahora en la cima debido a ..._CLEAR_TOP ).

Comenzando en API 16 (Jelly Bean), puedes simplemente llamar a finishAffinity() .

Ahora también puede llamar a ActivityCompat.finishAffinity(Activity activity) con la biblioteca de compatibilidad.

Asegúrese de establecer taskAffinity en el manifiesto en un nombre de paquete exclusivo para ese grupo de actividades.

Ver para más información:
http://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#finishAffinity%28android.app.Activity%29

Intenta usar

 intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 

y no

 intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 

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

Según Wakka en Eliminar una actividad de la stack de historial …


Agregue el android:noHistory="true" a su en AndroidManifest.xml siguiente manera:

    

Si su aplicación tiene una versión sdk mínima 16, entonces puede usar finishAffinity ()

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

Esto es trabajo para mí En la pantalla de pago superior eliminar 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

Use finishAffinity (); en la tarea C cuando se inicia la tarea A para borrar las actividades de backstack.

use este código para comenzar una nueva actividad y cierre o destruya todas las demás stacks de actividades o back satack …

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

Encontré las respuestas aquí un poco engañosas porque el código en la pregunta original parece funcionar bien para mí.

Siendo A la actividad raíz, al iniciarla desde B o C solo con FLAG_ACTIVITY_CLEAR_TOP elimina B y C de la stack posterior.

 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.FLAG_ACTIVITY_CLEAR_TOP no funcionará en este caso. Usa (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)

Para obtener más detalles, consulte esta documentación.

Me parece que necesita iniciar la Activity C de la Activity B usando startActivityForResult() . Cuando haces clic en un botón en la Activity C , llamas a setResult(RESULT_OK) y finish() para que la Activity C finish() . En la Activity B , puede hacer que onActivityResult() responda llamando también a finish() sobre sí mismo, y luego se le devolverá a la Activity A

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

Puede usar este ejemplo para llamar su Activity A desde 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);

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

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

Ahora agregue las siguientes banderas al iniciar A desde cualquier lugar. Despejará la stack.

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

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

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

El código dado funciona correctamente. Lo intenté en la muestra del ciclo de vida de la aplicación.

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

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 la bandera no funciona para usted, entonces puede intentar esto … Pero aún así lo recomiendo, no lo use

Agregar NINGUNA bandera de historia en el bash.

En la actividad B, comienza 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(); 

En manifiesto

 android:launchMode="singleTask" 

y

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

Agregue esto a su Activity B y Activity C

 android:noHistory="true" 

o onBackPressed función de presionado a onBackPressed para evitar presionar de nuevo con un return .

 @Override public void onBackPressed() { return; } 

Utilice el método setFlags () para borrar todo el lado abierto de la actividad y cierre su actividad

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

Esto funcionó para mí 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(); } 

Esta es una respuesta muy antigua y realmente no encontré una solución adecuada para ella, con el único propósito de limpiar BackStack, decidí crear mi propia backstack, que ni siquiera es stack tbh, pero no tiene ser, ya que queremos limpiar todo de todos modos;

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


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

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

Y dentro del método onCreate de todas las otras actividades:

 MainActivity.backStack.add(this); 

Y finalmente, cuando quieras limpiar la backstack, simplemente llama:

 public static void killBackStack () { for (Activity ac : backStack) { if (ac != null) ac.finish(); } } 
 Intent intent = new Intent(this, A.class); startActivity(intent); finish();