para - manual de programacion android pdf
Android: elimine todas las actividades anteriores de la pila posterior (15)
Cuando hago clic en el botón Cerrar sesión en mi Actividad de perfil, quiero llevar al usuario a la página de inicio de sesión , donde necesita usar nuevas credenciales.
Por lo tanto, utilicé este código:
Intent intent = new Intent(ProfileActivity.this,
LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
en el onButtonClick
del botón Cerrar sesión.
Pero el problema es cuando hago clic en el botón Atrás del dispositivo en la Actividad de inicio de sesión me lleva a ProfileActivity. Esperaba que la aplicación se cerrara cuando presioné el botón de volver al dispositivo en LoginActivity.
¿Qué estoy haciendo mal?
También agregué android:launchMode="singleTop"
en el manifiesto para mi LoginActivity
Gracias
Aquí hay una solución para borrar todas las actividades de su aplicación cuando usa el botón de cerrar sesión.
Cada vez que comienzas una actividad, comienza de esta manera:
Intent myIntent = new Intent(getBaseContext(), YourNewActivity.class);
startActivityForResult(myIntent, 0);
Cuando desee cerrar toda la aplicación, haga esto:
setResult(RESULT_CLOSE_ALL);
finish();
RESULT_CLOSE_ALL es una variable global final con un entero único para indicar que desea cerrar todas las actividades.
Luego, defina la devolución de llamada onActivityResult(...)
cada actividad para que cuando una actividad regrese con el valor RESULT_CLOSE_ALL, también llame a finish()
:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(resultCode)
{
case RESULT_CLOSE_ALL:
setResult(RESULT_CLOSE_ALL);
finish();
}
super.onActivityResult(requestCode, resultCode, data);
}
Esto causará un efecto de cascada que cierra todas tus actividades.
Sin embargo, este es un truco y usa startActivityForResult
de una manera que no fue diseñado para ser utilizado.
Tal vez una mejor manera de hacer esto sea usar receptores de radiodifusión como se muestra aquí:
Vea estos hilos para otros métodos también:
En el nivel API 11 o superior, use FLAG_ACTIVITY_CLEAR_TASK
y FLAG_ACTIVITY_NEW_TASK
Intent para borrar toda la pila 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);
La solución propuesta here , funcionó para mí.
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);
Sin embargo, requiere un nivel de API> = 11.
Lo que funcionó para mí
Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
Ninguno de los indicadores de intención funcionó para mí, pero así es como lo solucioné:
Cuando un usuario cierra una sesión de una actividad, tuve que transmitir un mensaje de esa actividad, luego lo recibí en las actividades que quería cerrar, después de lo cual llamo finish (); y funciona bastante bien
Para API 11+, puede usar Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK
esta manera:
Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent);
Borrará totalmente todas las actividades anteriores y comenzará una nueva actividad.
Para borrar completamente la pila de actividades, desea crear una nueva pila de tareas usando TaskStackBuilder, por ejemplo:
Intent loginIntent = LoginActivity.getIntent(context);
TaskStackBuilder.create(context).addNextIntentWithParentStack(loginIntent).startActivities();
Esto no solo creará una nueva pila de tareas limpia, sino que también permitirá el correcto funcionamiento del botón "subir" si su LoginActivity tiene una actividad principal.
Prueba esto, funcionará:
Intent logout_intent = new Intent(DashboardActivity.this, LoginActivity.class);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(logout_intent);
finish();
Puedes probar finishAffinity()
, cierra todas las actividades actuales y funciona en y sobre Android 4.1
Solo mantén
Intent intent = new Intent(ProfileActivity.this,
LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Una posible solución que puedo sugerirte es agregar android:launchMode="singleTop"
en el manifiesto para mi ProfileActivity . y cuando se hace clic en cerrar sesión, puede cerrar la sesión comenzando de nuevo LoginActivity. al cerrar la sesión puede llamar esto.
Intent in = new Intent(Profile.this,Login.class);
in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(in);
finish();
Use lo siguiente para la activity
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.
finishAffinity()
agregado en API 16. Use ActivityCompat.finishAffinity()
en versiones anteriores. Cuando lanzará cualquier actividad usando intención y terminará () la actividad actual. Ahora usa ActivityCompat.finishAffinity()
lugar de finish()
. terminará toda la actividad apilada debajo de la actividad actual. Funciona bien para mí.
También estoy enfrentando el mismo problema ..
en la actividad de inicio de sesión lo que hago es.
Intent myIntent = new Intent(MainActivity.this, ActivityLoggedIn.class);
finish();
MainActivity.this.startActivity(myIntent);
al cerrar la sesión
Intent myIntent = new Intent(ActivityLoggedIn.this, MainActivity.class);
finish();
ActivityLoggedIn.this.startActivity(myIntent);
Esto funciona bien, pero cuando estoy en ActivityLoggedIn y minimizo la aplicación y hago clic en el ícono del botón de inicio en el cajón de la aplicación, la actividad principal comienza de nuevo: - / Estoy usando la bandera
android:LaunchMode:singleTask
para la actividad principal.
Utilizar esta
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();