¿Cómo evitar volver a la actividad anterior?


210

Cuando se presiona el botón ATRÁS en el teléfono, quiero evitar que una actividad específica regrese a la anterior.

Específicamente, tengo pantallas de inicio de HomeScreensesión y registro , ambas comienzan una nueva actividad llamada cuando ocurre un inicio de sesión / registro exitoso. Una vez que se inicia HomeScreen, quiero evitar que los usuarios puedan regresar a las pantallas de inicio de sesión o registro presionando la tecla ATRÁS.

Intenté usarlo Intent.FLAG_ACTIVITY_NO_HISTORY, pero como la aplicación tiene integración con Facebook, cuando se usa 'Iniciar sesión con Facebook', Facebook debería volver a la pantalla de inicio de sesión inicial, por lo tanto, debería mantener un historial de estas actividades.

Pensé en anular el comportamiento del botón ATRÁS HomeScreenpara finalizar directamente una aplicación cuando se presiona el botón y usé

@Override
public void onBackPressed() {
    finish();
}

pero eso tampoco funciona.


1
Solo para aclarar, ¿estás tratando de capturar el comportamiento de todos excepto Facebook?
havexz

2
En cierto sentido, sí, pero en realidad lo que quiero es después de que se inicie un inicio de sesión exitoso y se abra HomeScreen, el usuario no debería poder volver a la pantalla de inicio de sesión presionando el botón ATRÁS. Al igual que Twitter o Foursquare, por ejemplo, una vez que iniciamos sesión en esas aplicaciones, no vemos la página de inicio de sesión hasta que cerramos sesión (incluso si presionamos ATRÁS después de iniciar sesión).
ecem

Respuestas:


345

Mi sugerencia sería finalizar la actividad a la que no desea que los usuarios vuelvan. Por ejemplo, en su actividad de inicio de sesión, justo después de llamar startActivity, llame finish(). Cuando los usuarios presionan el botón Atrás, no podrán ir a la actividad de inicio de sesión porque se eliminó de la pila.


2
¿Qué sucede si me gustaría que el hilo de la actividad anterior siga ejecutándose?
AlleyOOP

2
Entonces no querrás seguir mi enfoque. Llamar a finish () va a matar la actividad. ¿Podría comenzar el proceso que desea ejecutar en la actividad que va a realizar?
codificador

77
Nota: si llama finishdurante una transición compartida, puede desangrarse la actividad anterior. por ejemplo, si usted tiene HomeActivity-> IntermediateActivity-> FinalActivity, y le llamaremos finish()en el IntermediateActivityinmediatamente después de comenzar la FinalActivityverá el HomeActivitypor un breve momento.
David Murdoch

101

La siguiente solución puede ser bastante útil en el escenario habitual de inicio de sesión / actividad principal o implementar una pantalla de bloqueo.

Para minimizar la aplicación en lugar de volver a la actividad anterior, puede anular onBackPressed()así:

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

moveTaskToBack(boolean nonRoot)deja la pila de respaldo como está, simplemente pone su tarea (todas las actividades) en segundo plano. Igual que si el usuario presionara el botón de Inicio .

Parámetro boolean nonRoot: si es falso, esto solo funciona si la actividad es la raíz de una tarea; si es cierto, funcionará para cualquier actividad en una tarea.


3
Perfecto para una pantalla de inicio de sesión porque mantiene el historial intacto.
Hackmodford

Gracias, intenté encontrar esto durante unos tres días. Debido a android: el indicador noHistory = "true" para Activity no funciona como se esperaba (el indicador noHistory recrea la actividad después de la minimización) y terminar () a veces no funcionó para mí, pero por qué todavía no lo entiendo.
Denshov

37

No estoy seguro de lo que quieres exactamente, pero parece que debería ser posible, y también parece que ya estás en el camino correcto.

Aquí hay algunos enlaces que pueden ayudar:

Deshabilitar el botón de retroceso en Android

  MyActivity.java =>
    @Override
    public void onBackPressed() {

       return;
    }

¿Cómo puedo desactivar 'volver' a alguna actividad?

  AndroidManifest.xml =>
<activity android:name=".SplashActivity" android:noHistory="true"/>

1
No puedo usar la opción noHistory debido al problema de Facebook que intenté explicar en mi pregunta y también en uno de los comentarios. Pero la cosa con el botón ATRÁS no es deshabilitarlo, sino hacer que salga de toda la aplicación como System.exit(0)se llama (sé que no es la mejor práctica, pero solo quería dar un ejemplo).
ecem

Gracias, esto funcionó muy bien. La única sugerencia que haría aquí sería, no hay necesidad de volver. Simplemente elimine super.onBackPressed (); y deje el método en blanco. Eso también funciona bien
hyperCoder

20

Hay dos soluciones para su caso, la actividad A comienza la actividad B, pero no desea volver a la actividad A en la actividad B.

1. Se eliminó la actividad anterior A de la pila posterior.

    Intent intent = new Intent(activityA.this, activityB.class);
    startActivity(intent);
    finish(); // Destroy activity A and not exist in Back stack

2. Desactivar la acción del botón de retroceso en la actividad B.

Hay dos formas de evitar el evento de retroceso como se muestra a continuación,

1) Recomendar enfoque

@Override
public void onBackPressed() {
}

2, anular el método onKeyDown

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode==KeyEvent.KEYCODE_BACK) {
        return false;
    }
    return super.onKeyDown(keyCode, event);
}

Espero que sea útil, pero aún depende de tus situaciones.


3
¿No es una mala experiencia de usuario deshabilitar onBackPressed ()?
C. Skjerdal

Depende totalmente de lo que intente hacer, en la funcionalidad de la aplicación necesita esto y luego adelante.
user3099225

Es sorprendente cómo olvidé por completo el primer método que utilicé finish(). ¡Pensamiento innecesario con nohistoryatributos, indicadores de intención, etiquetas de manifiesto de actividad principal, etc.! Tonto, gracias por la respuesta!
varun

8

Como ya se sugieren muchas soluciones excelentes, trataré de dar una explicación más dictiva.

¿Cómo omitir volver a la actividad anterior?

Eliminar la actividad anterior de Backstack. Sencillo

¿Cómo eliminar la actividad anterior de Backstack?

Llamada finish()Método de

El flujo normal:

ingrese la descripción de la imagen aquí
Todas las actividades se almacenan en una pila conocida como Backstack.
Cuando comienza una nueva Actividad ( startActivity(...)), la nueva Actividad se empuja a la parte superior de la pila y cuando presiona el botón Atrás, la Actividad se saca de la pila.
Un punto clave a tener en cuenta es que cuando se presiona el botón Atrás, el finish();método se llama internamente. Este es el comportamiento predeterminado del método onBackPressed ().

Entonces, si desea omitir la Actividad B?

es decir, A <--- C

Simplemente agregue el finish();método después de su startActvity(...)en la Actividad B

Intent i = new Intent(this, C.class);
startActivity(i);
finish();

ingrese la descripción de la imagen aquí


6

finish()le brinda un método para cerrar la actividad actual, no toda la aplicación. Y es mejor que no intente buscar métodos para eliminar la aplicación. Un pequeño consejo

¿Has probado la conjunción de Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY? ¡Recuerde usar estas banderas al Intentcomenzar la actividad!


2
FLAG_ACTIVITY_NO_HISTORYevita que mi LoginScreen capture la devolución de llamada de Facebook cuando se utiliza Iniciar sesión con Facebook. Porque una vez que el foco se apaga de la pantalla de inicio de sesión, no se puede reanudar (ya que no hay historial). Pero no lo he probado Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS, lo comprobaré, ¡gracias!
ecem

También gracias por el finish()método, no lo sabía.
ecem

4

Poner finish()justo después

Intent i = new Intent(Summary1.this,MainActivity.class);
            startActivity(i);
finish();

1
Esto es básicamente lo que dijo la respuesta aceptada de cuatro años antes.
TylerH

3

La respuesta de paulsm4 es la correcta. Si onBackPressed()solo regresas, deshabilitará el botón Atrás. Sin embargo, creo que un mejor enfoque dado su caso de uso es cambiar la lógica de la actividad, es decir, hacer que la actividad de su hogar sea la principal, verificar si el usuario ha iniciado sesión allí, si no, inicie la actividad de inicio de sesión. La razón es que si anula el botón Atrás en su actividad principal, la mayoría de los usuarios se confundirán cuando presionen hacia atrás y su aplicación no hace nada.



3

Este método funciona bien

Intent intent = new Intent(Profile.this, MainActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

2

Simplemente anule el método onKeyDown y verifique si se presionó el botón Atrás.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if (keyCode == KeyEvent.KEYCODE_BACK) 
    {
        //Back buttons was pressed, do whatever logic you want
    }

    return false;
}

1
@Override
public void onBackPressed() {
}

Cuando creas onBackPressed()simplemente elimina super.onBackPressed();y eso debería funcionar


1

Poner

finish();

inmediatamente después de ActivityStart para detener la actividad e impedir cualquier forma de volver a ella. Luego añade

onCreate(){
    getActionBar().setDisplayHomeAsUpEnabled(false);
    ...
}

a la actividad que está comenzando.

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.