Pregunta Android: borre la pila posterior


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

En A, utilizo este código para abrir B:

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

En B, uso este código para abrir C:

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

Cuando el usuario toca un botón en C, quiero volver a A y borrar la pila 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?


263
2018-04-26 18:03


origen


Respuestas:


Prueba 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 para   buen efecto en conjunto con   FLAG_ACTIVITY_NEW_TASK: si se usa para   iniciar la actividad raíz de una tarea,   traerá cualquier actualmente en ejecución   instancia de esa tarea a la   primer plano, y luego despejarlo a su   estado raíz Esto es especialmente útil,   por ejemplo, cuando se lanza una   actividad de la notificación   gerente.

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

373
2018-04-26 18:10



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

122
2017-12-03 20:10



¿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.


64
2018-06-28 20:38



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 una bandera 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);

52
2017-07-11 07:46



  1. Añadir android:launchMode="singleTop" al elemento de actividad en su manifiesto para la Actividad A
  2. Entonces usa intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)  y intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) al comenzar 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 pila de respaldo con A en la raíz y usando singleTop garantiza que solo lanzará A una vez (ya que A está ahora en la cima debido a ..._CLEAR_TOP)


27
2018-04-26 18:35



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

Ahora también puedes llamar 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


22
2018-05-29 22:58



Intenta usar

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

y no

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

13
2018-05-16 07:58



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

7
2018-05-17 03:09