Termine todas las actividades anteriores

Mi aplicación tiene las siguientes pantallas de flujo:

Home->screen 1->screen 2->screen 3->screen 4->screen 5

Ahora tengo un botón de cierre de log out común en cada pantalla

( Home/ screen 1 / screen 2 /screen 3/ screen 4 / screen 5 )

Quiero que cuando el usuario haga clic en el botón de cerrar sesión (desde cualquier pantalla), todas las pantallas se terminen y se abra una nueva pantalla de inicio de Log in .

He intentado con casi FLAG_ACTIVITY para lograr esto. También recibo algunas respuestas en stackoverflow, pero no puedo resolver el problema. Mi aplicación está en Android 1.6, por lo que no puedo usar FLAG_ACTIVITY_CLEAR_TASK

¿Hay alguna forma de resolver el problema?

Utilizar:

 Intent intent = new Intent(getApplicationContext(), Home.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); 

Esto borrará todas las actividades en la parte superior de la casa.

Asumiendo que está terminando la pantalla de inicio de sesión cuando el usuario inicia sesión y se crea la página de inicio y luego todas las pantallas del 1 al 5 encima de esa. El código que publiqué lo regresará a la pantalla de inicio para finalizar todas las demás actividades. Puede agregar un extra en el bash y leerlo en la actividad de la pantalla de inicio y terminarlo también (tal vez abrir la pantalla de inicio de sesión desde allí o algo así).

No estoy seguro, pero también puedes intentar ingresar con esta bandera. No sé cómo se ordenarán las actividades en ese caso. Por lo tanto, no sé si eliminará los que están debajo de la pantalla en la que se encuentra, incluido el que está actualmente pero definitivamente es el camino a seguir.

Espero que esto ayude.

Puede intentar Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK . Borrará totalmente todas las actividades anteriores y comenzará una nueva actividad.

Antes de iniciar su nueva actividad, simplemente agregue el siguiente código:

 finishAffinity(); 

O si quieres que funcione en versiones anteriores de Android:

 ActivityCompat.finishAffinity(this); 

Cuando el usuario desea salir de todas las actividades abiertas , debe presionar un botón que carga la primera actividad que se ejecuta cuando se inicia la aplicación, borra todas las demás actividades y luego termina la última actividad restante. Haga que se ejecute el siguiente código cuando el usuario presione el botón de salida. En mi caso, LoginActivity es la primera actividad en mi progtwig para ejecutar.

 Intent intent = new Intent(getApplicationContext(), LoginActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra("EXIT", true); startActivity(intent); 

El código anterior borra todas las actividades a excepción de LoginActivity . A continuación, coloque el siguiente código dentro de onCreate(...) , para escuchar cuándo se recrea la actividad de LoginActivity y se pasa la señal ‘EXIT’:

 if (getIntent().getBooleanExtra("EXIT", false)) { finish(); } 

¿Por qué es tan difícil hacer un botón de salida en Android?

Android se esfuerza por disuadirle de tener un botón de “salida” en su aplicación, porque quiere que al usuario nunca le importe si los progtwigs que usan se ejecutan o no en segundo plano.

Los desarrolladores del sistema operativo Android quieren que su progtwig pueda sobrevivir a un apagado inesperado y apagar el teléfono, y cuando el usuario reinicia el progtwig, retoman justo donde lo dejaron. De modo que el usuario puede recibir una llamada telefónica mientras usa su aplicación, y abrir mapas que requieren que su aplicación sea liberada para obtener más recursos.

Cuando el usuario reanuda su aplicación, retoman justo donde lo dejaron sin interrupción. Este botón de salida está usurpando la energía del administrador de actividades, lo que puede causar problemas con el ciclo de vida del progtwig Android administrado automáticamente.

 Intent intent = new Intent(this, classObject); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); 

Esto funcionará para todas las versiones de Android. Donde IntentCompat agregó la clase en la biblioteca de soporte de Android.

Use lo siguiente para la actividad

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

eliminar el indicador CLEAR_TASK para el uso de fragmentos.

Espero que esto pueda usarse para algunas personas.

De desarrollador.android.com :

 public void finishAffinity () 

Agregado en el nivel de API 16

Finalice esta actividad, así como todas las actividades inmediatamente debajo de ella en la tarea actual que tengan la misma afinidad. Esto se usa generalmente cuando una aplicación puede iniciarse en otra tarea (como desde un ACTION_VIEW de un tipo de contenido que entiende) y el usuario ha utilizado la navegación hacia arriba para cambiar de la tarea actual a su propia tarea. En este caso, si el usuario ha navegado hacia abajo en cualquier otra actividad de la segunda aplicación, todas deben eliminarse de la tarea original como parte del cambio de tarea.

Tenga en cuenta que este acabado no le permite entregar resultados a la actividad anterior, y se lanzará una excepción si está tratando de hacerlo.

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

Una solución que implementé para esto (creo que lo encontré en Stack Overflow en alguna parte, pero no recuerdo, así que gracias a quien hizo eso en primer lugar):

De cualquiera de sus actividades, haga esto:

 // Clear your session, remove preferences, etc. Intent intent = new Intent(getBaseContext(), LoginActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); 

Luego, en su LoginActivity, sobrescriba onKeyDown:

 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { moveTaskToBack(true); return true; } return super.onKeyDown(keyCode, event); } 

Para el botón de cierre de sesión en la última pantalla de la aplicación, use este código en el oyente del botón de cierre de sesión para finalizar todas las actividades anteriores abiertas, y su problema está resuelto.

 { Intent intent = new Intent(this, loginScreen.class); ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } 
  Intent i1=new Intent(getApplicationContext(),StartUp_Page.class); i1.setAction(Intent.ACTION_MAIN); i1.addCategory(Intent.CATEGORY_HOME); i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); i1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(i1); finish(); 

tengo el mismo problema, puede usar IntentCompat , así:

 import android.support.v4.content.IntentCompat; intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK); 

este código funciona para mí

Android api 17

En una nota lateral, es bueno saber
Esta respuesta funciona ( https://stackoverflow.com/a/13468685/7034327 )

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

mientras que esto no funciona

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

.setFlags() reemplaza a todos los indicadores anteriores y no añade ninguna marca nueva mientras que .addFlags() sí lo hace.

Entonces esto también funcionará

 Intent intent = new Intent(getApplicationContext(), LoginActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); 

Iniciar sesión> Inicio-> pantalla 1-> pantalla 2-> pantalla 3-> pantalla 4-> pantalla 5

en la pantalla 4 (o cualquier otro) ->

  StartActivity (Iniciar sesión) 

con

  FLAG_ACTIVITY_CLEAR_TOP 

Si está utilizando startActivityForResult() en sus actividades anteriores, simplemente anule OnActivityResult() y llame a finish(); método dentro de él en todas las actividades … Esto hará el trabajo …

para API> = 15 a API 23 solución simple.

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

en lugar de usar finish() solo usa finishAffinity();

Cuando el usuario haga clic en el botón de cerrar sesión, escriba el siguiente código:

 Intent intent = new Intent(this, LoginActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); 

Y también cuando después de iniciar sesión, si llama a nueva actividad, no use finish ();

Supongo que llego tarde, pero hay una respuesta simple y breve. Hay un método finishAffinity () en Activity que finalizará la actividad actual y todas las actividades principales, pero solo funciona en Android 4.1 o superior.

Para API 16+, use

finishAffinity();

Por debajo de 16, use

ActivityCompat.finishAffinity(YourActivity.this);

¡Espero eso ayude!

En el nivel API 11 o superior, use FLAG_ACTIVITY_CLEAR_TASK y FLAG_ACTIVITY_NEW_TASK marcando Intent para borrar toda la stack de actividades.

 Intent i = new Intent(OldActivity.this, NewActivity.class); // set the new task and clear flags i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK) startActivity(i); 

Si ingresas al usuario en la screen 1 y desde allí vas a las otras pantallas, usa

 Intent intent = new Intent(this, Screen1.class); intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); 

Simplemente, cuando va desde la pantalla de inicio de sesión, no cuando termina la pantalla de inicio de sesión.

Y luego en todas las actividades de reenvío, use esto para cerrar la sesión:

 final Intent intent = new Intent(getBaseContext(), LoginScreen.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); context.startActivity(intent); 

Funciona perfectamente

Encontré de esta manera, borrará toda la historia y saldrá

 Intent startMain = new Intent(Intent.ACTION_MAIN); startMain.addCategory(Intent.CATEGORY_HOME); startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(startMain); Intent intent = new Intent(getApplicationContext(), SplashScreen.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); finish(); System.exit(0); 

Encontré que esta solución funciona en todos los dispositivos a pesar del nivel de API (incluso para <11)

 Intent intent = new Intent(getApplicationContext(), LoginActivity.class); ComponentName cn = intent.getComponent(); Intent mainIntent = IntentCompat.makeRestartActivityTask(cn); startActivity(mainIntent);