vida onstop example developers created ciclo activity java android android-activity screen flow

java - onstop - onstart android example



Terminar todas las actividades anteriores. (23)

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 terminarán y se abrirá una nueva pantalla Log in .

He intentado casi todo FLAG_ACTIVITY para lograr esto. También paso por 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 manera de resolver el problema?


Antes de lanzar 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 haga clic en el botón de cierre de 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 una nueva actividad, no use finish ();


Desde developer.android.com :

public void finishAffinity ()

Añadido en el nivel 16 de API

Termine esta actividad así como todas las actividades inmediatamente debajo de ella en la tarea actual que tienen la misma afinidad. Esto generalmente se usa cuando una aplicación se puede iniciar en otra tarea (por ejemplo, desde un ACTION_VIEW de un tipo de contenido que comprende) y el usuario ha usado 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 esas deben eliminarse de la tarea original como parte del interruptor de tarea.

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


En una nota al margen, es bueno saber
Esta respuesta funciona ( https://.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 los indicadores anteriores y no .addFlags() ningún indicador nuevo mientras que .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);


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

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


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

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


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

en la pantalla 4 (o cualquier otro) ->

StartActivity(Log in) con

FLAG_ACTIVITY_CLEAR_TOP


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 abiertas abiertas, y su problema se resolverá.

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


Puedes probar Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK . Borra totalmente todas las actividades anteriores y comienza una nueva actividad.


Si está usando 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 ...


Si inicia sesión en el usuario en la screen 1 y desde allí pasa a las otras pantallas, use

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 su aplicación tiene un mínimo de sdk versión 16, entonces puede usar finishAffinity ()

Termine esta actividad así como todas las actividades inmediatamente debajo de ella en la tarea actual que tienen la misma afinidad.

Esto es trabajo para mí. En la pantalla Top Payment, 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


Simplemente, cuando salga de la pantalla de inicio de sesión, no cuando termine la pantalla de inicio de sesión.

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

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

Funciona perfectamente.


Supongo que llego tarde pero hay respuesta simple y corta. Hay un método finishAffinity () en la actividad 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!


Tengo el mismo problema, puedes 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í.

Api de Android 17


Una solución que implementé para esto (creo que la encontré en 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); }


Usa 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 de utilidad para algunas personas.


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 la página de inicio y luego todas las pantallas de 1 a 5 encima de esa. El código que publiqué lo regresará a la pantalla de inicio y terminará todas las demás actividades. Puedes agregar un extra en la intención y leerlo en la actividad de la pantalla de inicio y también finalizarlo (quizás vuelva a iniciar la pantalla de inicio de sesión desde allí o algo así).

No estoy seguro, pero también puedes intentar iniciar sesión con este indicador. No sé cómo se ordenarán las actividades en ese caso. Así que no sé si borrará las que están debajo de la pantalla en la que se encuentra, incluida la que está actualmente, pero definitivamente es el camino a seguir.

Espero que esto ayude.


en lugar de usar finish() simplemente use finishAffinity();


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


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 su aplicación, borrar todas las demás actividades, y luego finalizar la última actividad restante. Haga que el siguiente código se ejecute cuando el usuario presione el botón de salir. En mi caso, LoginActivity es la primera actividad en mi programa en ejecutarse.

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 onCreate(...) , para escuchar cuando se LoginActivity crear LoginActivity y se haya pasado la señal de ''SALIR'':

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

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

Android intenta evitar que tengas un botón de "salir" en tu aplicación, porque quieren que el usuario nunca se preocupe por si los programas que usan se ejecutan en segundo plano o no.

Los desarrolladores del sistema operativo Android desean que su programa pueda sobrevivir a un apagado y apagado inesperado del teléfono, y cuando el usuario reinicia el programa, retomará el lugar donde lo dejó. Por lo tanto, 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 aplicación, se retira justo donde se detuvo sin interrupción. Este botón de salida está usurpando el poder del administrador de actividades, lo que podría causar problemas con el ciclo de vida del programa Android administrado automáticamente.


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


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 agregada en la biblioteca de soporte de Android.