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
- Visualización compartida de Android en otros dispositivos
- Aplicación para Android: admite todos los tamaños de pantalla
- Cómo evitar reiniciar la actividad cuando cambia la orientación en Android
- GetLocationOnScreen () vs getLocationInWindow ()
- Detectar sólo captura de pantalla con FileObserver Android
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?
- ¿Cómo restaurar la posición de desplazamiento de texto tras la rotación de la pantalla?
- Cómo obtener la anchura de pantalla dpi en ANDROID?
- Archivo en blanco se guarda cuando se utiliza screencap programatically en Android
- ¿Previene el bloqueo de la pantalla en atenuación / espera mientras usa la aplicación android?
- ¿Qué tamaños de pantalla son necesarios para dispositivos móviles android y ios?
- Crear carpeta en la pantalla de inicio mediante programación?
- cómo puedo obtener el tamaño real de la pantalla cuando una aplicación se ejecuta en modo de compatibilidad
- Cómo agregar acceso directo a la pantalla de inicio en android mediante programación
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
-
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();
-
Para arriba API 11
finishAffinity();
- Cómo cargar un ImageView por URL en Android?
- Dispositivo ADB de Android sin conexión, no puede emitir comandos