studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android back-stack

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í:

Al cerrar la sesión, borre la pila del historial de actividades, impidiendo que el botón "Atrás" abra las actividades registradas solo

Vea estos hilos para otros métodos también:

Android: borre la pila posterior

Termine todas las actividades anteriores


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