Pregunta

Mi aplicación tiene las siguientes pantallas de flujo:

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

Ahora tengo un común log out botó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 terminen y aparezca una nueva. Log in abrirá .

he probado casi todos FLAG_ACTIVITY lograr esto.También revisé algunas respuestas en stackoverflow, pero no pude resolver el problema.Mi aplicación está en Android 1.6, por lo que no puedo usarla. FLAG_ACTIVITY_CLEAR_TASK

¿Hay alguna forma de solucionar el problema?

¿Fue útil?

Solución

Usar:

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

Suponiendo que está terminando la pantalla de inicio de sesión cuando el usuario inicia sesión y se crea el 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 y finalizará todas las demás actividades.Puede agregar un extra en la intención y leerlo en la actividad de la pantalla de inicio y finalizarlo también (tal vez iniciar la pantalla de inicio de sesión nuevamente desde allí o algo así).

No estoy seguro, pero también puedes intentar 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 te encuentras, incluido el que estás actualmente, pero definitivamente es el camino a seguir.

Espero que esto ayude.

Otros consejos

Puedes intentarlo 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, deben presionar un botón que carga la primera actividad que se ejecuta cuando se inicia la aplicación, borrar todas las demás actividades y luego finalizar 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 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 del LoginActivity's onCreate(...), para escuchar cuando LoginActivity se recrea y se pasa la señal 'SALIDA':

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

¿Por qué es tan difícil crear 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 programas que utiliza se ejecutan en segundo plano o no.

Los desarrolladores del sistema operativo Android quieren que su programa pueda sobrevivir a un apagado inesperado del teléfono, y cuando el usuario reinicia el programa, continúa justo donde lo dejó.De modo que el usuario puede recibir una llamada telefónica mientras usa su aplicación y abrir mapas, lo que requiere que su aplicación esté libre para obtener más recursos.

Cuando el usuario reanuda su solicitud, continúa justo donde lo dejó sin interrupción.Este botón de salida está usurpando energía del administrador de actividades, lo que podría causar 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.Dónde IntentCompat la clase agregada 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);

elimine el indicador CLEAR_TASK para el uso de fragmentos.

Espero que esto pueda ser útil para algunas personas.

De desarrollador.android.com:

public void finishAffinity ()

Agregado en el nivel API 16

Termine esta actividad, así como todas las actividades inmediatamente inferiores en la tarea actual que tengan la misma afinidad.Esto generalmente se usa cuando una aplicación se puede iniciar en otra tarea (como desde un ACTION_VIEW de un tipo de contenido que comprende) y el usuario ha usado la navegación hacia arriba para salir de la tarea actual y entrar a su propia tarea.En este caso, si el usuario ha navegado hacia otras actividades de la segunda aplicación, todas ellas deben eliminarse de la tarea original como parte del cambio de tarea.

Tenga en cuenta que este final no le permite entregar resultados a la actividad anterior y se generará una excepción si intenta hacerlo.

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

Para API 16+, utilice

finishAffinity();

Para menores de 16 años, utilice

ActivityCompat.finishAffinity(YourActivity.this);

¡Espero eso ayude!

Como nota al margen, es bueno saberlo.
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 cualquier bandera anterior y no agrega ninguna bandera nueva mientras .addFlags() 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);

Si su aplicación tiene una versión mínima de SDK 16, entonces puede usar finalizarAfinidad()

Termine esta actividad, así como todas las actividades inmediatamente inferiores en la tarea actual que tengan la misma afinidad.

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

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

Desde cualquiera de tus actividades haz 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 cerrar sesión en la última pantalla de la aplicación, use este código en el oyente del botón de cerrar sesión para finalizar todas las actividades anteriores abiertas y su problema estará 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 que puedes usar IntentCompat , como esto :

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

En lugar de usar finish() Solo usa finishAffinity();

En mi caso uso finishAffinity() funcionar en la última actividad como:

finishAffinity()
startHomeActivity()

Espero que sea útil.

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

en la pantalla 4 (o cualquier otra) ->

StartActivity(Log in)
con
FLAG_ACTIVITY_CLEAR_TOP

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 estas usando startActivityForResult() en sus actividades anteriores, simplemente anule OnActivityResult() y llama al finish(); método dentro de él en todas las actividades..Esto hará el trabajo...

Cuando el usuario haga clic en el botón 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, llama a una nueva actividad, no use Finish();

Simplemente, cuando sales de la pantalla de inicio de sesión, no al finalizar la pantalla de inicio de sesión.

Y luego, en todas las actividades directas, use esto para cerrar sesión:

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

Funciona perfectamente.

Si inicia sesión como usuario en screen 1 y de ahí vas a las otras pantallas, usas

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

Encontré esta manera, borrará todo el historial 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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top