Finalizar 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 cierre de sesión (desde cualquier pantalla), todas las pantallas estarán terminadas y se abrirá una nueva pantalla de inicio de Log in .

He intentado casi todas FLAG_ACTIVITY para lograr esto. También voy a través de algunas respuestas en stackoverflow, pero no ser capaz de resolver el problema. Mi aplicación está en Android 1.6 para no poder 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.

Suponiendo que está terminando la pantalla de inicio de sesión cuando el usuario inicia sesión y se crea el hogar y después todas las pantallas de 1 a 5 en la parte superior de la misma. El código que posteé te devolverá a la pantalla de inicio finalizando todas las otras actividades. Puedes añadir un extra en la intención y leer eso en la actividad de la pantalla de inicio y terminarlo también (tal vez iniciar la pantalla de inicio de nuevo desde ahí o algo así).

No estoy seguro, pero también puede intentar ir a iniciar sesión con esta bandera. No sé cómo se ordenarán las actividades en ese caso. Así que no sé si borrará los que están debajo de la pantalla en la que está incluido, incluyendo el que está actualmente, pero es definitivamente el camino a seguir.

Espero que esto ayude.

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

Antes de lanzar su nueva Actividad, simplemente añada 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, borrar todas las otras actividades y luego terminar la última actividad restante. Haga que el siguiente código se ejecute cuando el usuario presiona el botón de salida. En mi caso, LoginActivity es la primera actividad en mi programa que se ejecuta.

 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 excepto LoginActivity . Luego, coloque el siguiente código dentro de la LoginActivity de onCreate(...) , para escuchar cuando se ha recreado LoginActivity y se ha transmitido 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 intenta disuadirte de tener un botón de "salida" en tu aplicación, porque quieren que el usuario nunca se preocupe por si los programas que utilizan se están ejecutando en segundo plano o no.

Los desarrolladores de Android OS quieren que su programa sea capaz de sobrevivir a un apagado inesperado y apagar el teléfono, y cuando el usuario reinicia el programa, recogen justo donde lo dejaron. Así, el usuario puede recibir una llamada telefónica mientras usa su aplicación y abrir mapas que requieren que su aplicación se libere para obtener más recursos.

Cuando el usuario reanuda su solicitud, recogen justo donde lo dejaron sin interrupción. Este botón de salida está usurpando la energía del administrador de actividades, causando potencialmente problemas con el ciclo de vida del programa 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 la clase agregó en la biblioteca de soporte de Android.

Utilice lo siguiente para la actividad

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

Quite el indicador CLEAR_TASK para el uso del fragmento.

Espero que esto pueda utilizar para algunas personas.

Desde developer.android.com :

 public void finishAffinity () 

Añadido en API nivel 16

Termine esta actividad así como todas las actividades inmediatamente debajo de ella en la tarea actual que tengan la misma afinidad. Esto suele utilizarse 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 ascendente 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 ellas deberían eliminarse de la tarea original como parte del conmutador de tareas.

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

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

De cualquiera de sus actividades, haga lo siguiente:

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

A continuación, en su LoginActivity, sobrescribir 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, utilice este código en el botón de cierre de sesión para terminar todas las actividades anteriores abiertas y el problema se resuelve.

 { Intent intent = new Intent(this, loginScreen.class); ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } 

Tengo el mismo problema que puede utilizar IntentCompat , como este:

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

Este código funciona para mí.

Api de Android 17

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

Termine 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 quite todas las activaciones de la pila trasera,

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

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

Registrar-> 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 

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

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

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 …

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

 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 nueva actividad no use finish ();

En una nota lateral, 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(); 

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 cualquier indicador anterior y no .addFlags() ningún nuevo indicador mientras .addFlags() hace.

Así que 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); 

Si accede al usuario en la screen 1 y desde allí va a las otras pantallas, utilice

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

Simplemente, cuando vaya desde la pantalla de inicio de sesión, no al terminar la pantalla de inicio de sesión.

Y luego en todas las actividades hacia adelante, utilice 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); 

He encontrado esta solución para trabajar en todos los dispositivos a pesar del nivel API (incluso para <11)

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

Prueba esto

  1. Para todas las versiones API

     Intent intent = new Intent(this, "Your_Class_name".class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); finish(); 
  2. Para arriba API 11

     finishAffinity(); 
  • Android Development: Cambio del brillo de la pantalla en el servicio
  • Manejo de actividad cuando la pantalla está desbloqueada
  • Deshabilitar el botón Inicio en la aplicación de pantalla de inicio?
  • Densidad y resolución de Android xhdpi
  • Mantenga la pantalla despierta durante toda mi actividad
  • Cómo encender la pantalla?
  • Cómo obtener el tamaño total de la pantalla en un dispositivo android programaticamente
  • ¿Cómo resolver el tamaño de pantalla de Android para diferentes dispositivos móviles?
  • Diferentes tamaños en 2 dispositivos, incluso si utilizo "dp"
  • ¿Cómo abrir la última pantalla de preferencias usadas?
  • Tamaños y densidades de pantalla Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.