Android: actividad abierta sin guardar en la pila


94

Tengo 2 actividades: Principal y Lista.

Desde Main puede abrir List; desde la Lista puede abrir Main.

Me gustaría que todas las aperturas de List no se guarden en el "historial". Por lo tanto, presionar atrás desde Main no puede regresar a List.

¿Es posible?


11
Si 'list' comienza con 'main', haga que llame finish()inmediatamente después startActivity(...). De esa manera, si el usuario presiona ATRÁS desde 'principal', no habrá nada a lo que volver.
Squonk

esto es para la navegación de notificaciones, pero los conceptos pueden ser aplicables developer.android.com/guide/topics/ui/notifiers/…
Kevin Lee

Respuestas:


159

Al comenzar la de su lista Activity, configure sus Intentbanderas así:

Intent i = new Intent(...); // Your list's Intent
i.setFlags(i.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); // Adds the FLAG_ACTIVITY_NO_HISTORY flag
startActivity(i);

La FLAG_ACTIVITY_NO_HISTORYbandera evita que Activityse agregue lo nuevo a la pila del historial.

NB: Como señala @Sam, puede usar i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);en su lugar. No hay diferencia funcional.


2
Solo un pequeño comentario sobre este método: este funcionará perfectamente si solo hay 2 actividades. Pero si la Actividad de la lista puede iniciar otra Actividad (digamos la tercera Actividad), al presionar el botón Atrás en la tercera Actividad se volverá a la Actividad principal y no a la Actividad de la lista
VinceFR

En efecto. Desafortunadamente, no hay forma de evitarlo. No hay una Intentbandera que diga "solo se suma a la historia si no se regresa al Activityde origen".
Eric

1
no, pero la bandera FLAG_ACTIVITY_NEW_TASK hará el trabajo, la actividad de la lista se agregará al historial, pero siempre en la parte superior, por lo que una presión posterior desde la actividad principal no mostrará la actividad de la lista
VinceFR

7
¿Hay alguna razón en particular por la que usaste setFlags()en getFlags()lugar de Intent.addFlags()?
Sam

1
@VinceFR ¡es exactamente lo que quiero! a -> b -> cy volver directamente a c-
realtebo

89

En el archivo de manifiesto, agregue:

android:noHistory="true" 

a la actividad que no desea mantener en la pila.


¿Hay alguna diferencia con el inicio de la actividad con el indicador no_history?
realtebo

1
Como dijiste en tu pregunta, "cada apertura de la lista NO se guarda en el 'historial'". Por lo tanto, cada vez que abres tu aplicación nuevamente, eso te llevará a la actividad principal
Marcin S.

@MarcinS. cuando la aplicación no está en la lista de aplicaciones recientes, no funciona. ¿Puede explicar por qué está sucediendo esto
Ajit Kumar Dubey

1
Entonces, ¿cuál es la diferencia entre esos 2 enfoques (manifiesto y bandera)?
pumbosha

El enfoque de @pumbosha Manifest siempre dejará la actividad fuera del historial. El enfoque de bandera le permite controlar ese comportamiento en tiempo de ejecución.
John Crawford

27

Utilice la nueva tarea con compensación. Esto funcionó en mi caso cuando las otras opciones no lo hicieron.

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

Borre todo el historial y comience una nueva actividad en Android


1
Esto sería genial, pero ¿hay alguna manera de detener la animación de "cambio de tarea" del sistema? Lamentablemente, agregar FLAG_ACTIVITY_NO_ANIMATION no lo impide.
androidguy

esto impacta en la velocidad de aplicación?
Acauã Pitta

23

Parece que si llamas a finish () en tu actividad justo después de haber abierto otra, la que está terminada se elimina de la pila.

por ejemplo:

Intent intent = new Intent(this, NextActivity.class);
startActivity(intent);
finish();

Si su teléfono no es tan rápido, verá que la actividad anterior se está moviendo.
Nolan

@Nolan, eso es solo si terminas antes de comenzar la actividad
Henrik Bøgelund Lavstsen

7

En mi caso particular FLAG_ACTIVITY_NO_HISTORYno funcionó. Ni lo hizo FLAG_ACTIVITY_NEW_TASKniFLAG_ACTIVITY_CLEAR_TASK trabajaron solos por sí mismos.

Sin embargo FLAG_ACTIVITY_NEW_TASKy FLAG_ACTIVITY_CLEAR_TASKjuntos funcionó.

Intent intent = new Intent(FooActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

3

Solo quería agregar una forma de hacer esto en Kotlin:

val i = Intent(this, LogInActivity::class.java)
startActivity(i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK))

2
Más de un estilo Kotlin: Intent(this, MainActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) }.also { startActivity(it) }
4ndro1d

3

Respuesta tardía, pero agrega algo de profundidad a otras respuestas. Todo se reduce a qué quieres que suceda con otras actividades iniciadas a partir de esa actividad.

Opción 1: solo esta actividad no debe tener un historial de actividad de llamadas

Entonces solo haz:

Intent i = new Intent(...);
i.addFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

Opción 2: todas las actividades iniciadas a partir de esa actividad específica no deben tener historial

Luego agregue el manifiesto de la actividad de llamada:

android:noHistory="true" 

Pero si desea tener un historial en una nueva actividad, debe eliminar manualmente la bandera:

Intent i = new Intent(...);
i.removeFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

Espero que aclare otras respuestas :)


2

Prueba FLAG_ACTIVITY_CLEAR_TOP si la actividad ya se está ejecutando:

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);


-4

¿No puede anular el botón de retroceso en la actividad en particular para detener la funcionalidad de 'devolución'?

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {

        return true;
    }
    return super.onKeyDown(keyCode, event);
}

6
No hagas esto. Es aceptable interceptar BACK para propósitos específicos, pero hacerlo simplemente para consumir BACK presione silenciosamente y evitar la terminación de un Activityno es una buena práctica.
Squonk

1
Estoy completamente de acuerdo, solo una opción.
Broak

1
Hay OnBackPressedpara eso.
Fred
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.