Android: volver a la actividad anterior


525

Quiero hacer algo simple en la aplicación de Android. ¿Cómo es posible volver a una actividad anterior?

¿Qué código necesito para volver a la actividad anterior?


55
Mantenga un registro de la última actividad abierta
Vuk,

54
Simplemente llame a terminar (); Saludos
Nguyen Minh Binh

super.finish (); si lo estás llamando desde dentro de la actividad!
happyhardik

55
Una pregunta aquí: si Android ha destruido la actividad anterior debido a menos memoria u otros problemas, entonces esa actividad ya no estaría allí en el backstack y luego ¿qué sucede?
Soleado

@Sunny Supongo que el recolector de basura comienza con la actividad más importante en la pila. Entonces, si no hay actividad previa, tampoco habrá actividad actual. Pero solo asumo eso porque ese comportamiento tendría más sentido que liberar memoria en una pila sin ningún orden en particular. Corrija mi comentario, si alguien lo sabe exactamente.
Sedat Kilinc

Respuestas:


486

Las actividades de Android se almacenan en la pila de actividades. Volver a una actividad previa podría significar dos cosas.

  1. Abriste la nueva actividad desde otra actividad con startActivityForResult . En ese caso, simplemente puede llamar a la función finishActivity () desde su código y lo llevará de regreso a la actividad anterior.

  2. Mantenga un registro de la pila de actividades. Siempre que comience una nueva actividad con una intención, puede especificar una marca de intención como FLAG_ACTIVITY_REORDER_TO_FRONTo FLAG_ACTIVITY_PREVIOUS_IS_TOP. Puede usar esto para barajar entre las actividades en su aplicación. Sin embargo, no los he usado mucho. Echa un vistazo a las banderas aquí: http://developer.android.com/reference/android/content/Intent.html

Como se menciona en los comentarios, si la actividad se abre con, startActivity()entonces se puede cerrar con finish(). Si desea utilizar el botón Arriba, puede detectarlo en el onOptionsSelected(MenuItem item)método de verificación de la ID del elemento en android.R.id.homecomparación con R.id.homelo mencionado en los comentarios.


237
O si abrió la actividad con startActivity (), puede cerrar con finish () (no necesita pasar ningún parámetro)
neworld

3
¿Puede aclarar dónde y cómo usa el acabado () para que cuando el usuario presione el botón arriba lo lleve a la actividad anterior
RicNjesh

44
@RicNjesh En su método onOptionsItemSelected si el elemento del menú en el que se hizo clic tiene el ID R.id.home, llame a terminar (). Cerrará la actividad actual y lo llevará de regreso a la actividad que la inició con startActivity ()
Anders Ullnæss

Estoy haciendo que el usuario realice muchas actividades una tras otra a través de intentos. ¿Debo hacer algo para asegurarme de que la aplicación no se bloquee con demasiadas actividades en la pila? ¡Gracias!
Ruchir Baronia

1
¿estás seguro de que la actividad 1 no morirá en algún momento antes de que termines la actividad 2?
user924

225

Tratar Activity#finish(). Esto es más o menos lo que hace el botón Atrás de forma predeterminada.


1
por qué #? o es un punto?
Nabin

8
Creo que quiso decirthis.finish();
Jens Bodal

69
El #es un indicador que finish()es un método no estático de la clase Actividad. No es Java válido, pero ayuda a explicar cómo se puede usar el método.
Bryan Herbst

2
@ Tanis.7x ¿Hay un indicador para los métodos estáticos?
Benten

8
@Benten que sería ., es decir:Activity.someStaticMethod()
JonnyReeves

81

Simplemente escriba en clic en terminar () . Te llevará a la Actividad anterior.


1
Aunque onBackPressed () también funciona, creo que esta solución es mejor para pensar en salir de una actividad que necesita solo por un momento ... por ejemplo, escáner OCR en mi caso. ¡Gracias!
Gene Bo

Esto satisface mi necesidad ... Gracias.
Roon13

68

Sólo esta

super.onBackPressed();

2
Esta llamada acaba de finalizar la actividad actual, por lo que mostrará la última actividad visible. Sin embargo, si no hay actividad previa o se destruye mientras tanto, la aplicación puede salir.
r1k0

22
Esto es hack Se supone que no debes llamar a esto directamente. Este es uno de los métodos del ciclo de vida y debe ser invocado por el sistema Android.
Dheeraj Bhaskar

33
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Esto lo llevará a una actividad previa manteniendo su pila y borrando todas las actividades posteriores de la pila.

Por ejemplo, si la pila era A-> B-> C-> D y comienza B con esta bandera, la pila será A-> B


Esto es lo que funciona de mi parte. Me encantaría descubrir qué causaría que finish () no funcione.
Relm

20

¿Desea tomar el control del comportamiento del botón Atrás? Puede anular el botón Atrás (para ir a una actividad específica) a través de uno de los dos métodos.

Para Android 1.6 y versiones inferiores:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
        // do something on back.
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

O si solo es compatible con Android 2.0 o superior:

@Override
public void onBackPressed() {
    // do something on back.
    return;
}

Para más detalles: http://android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html


19

Simplemente llame a este método para finalizar la actividad actual o para volver por onBackPressed

finish();

O

onBackPressed();

Estoy haciendo que el usuario realice muchas actividades una tras otra a través de intentos. ¿Debo hacer algo para asegurarme de que la aplicación no se bloquee con demasiadas actividades en la pila? ¡Gracias!
Ruchir Baronia

13

si quieres ir a solo quieres ir a la actividad anterior usa

finish();

O

onBackPressed();

si desea ir a la segunda actividad o debajo, use lo siguiente:

intent = new Intent(MyFourthActivity.this , MySecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//Bundle is optional
Bundle bundle = new Bundle();
bundle.putString("MyValue1", val1);
intent.putExtras(bundle);
//end Bundle
startActivity(intent);

1
Encontré que finish () y onBackPressed () funcionan, pero, al menos en mi aplicación, finish () es muy lento y onBackPressed () es mucho más rápido. Curioso.
scrayne

Estoy haciendo que el usuario realice muchas actividades una tras otra a través de intentos. ¿Debo hacer algo para asegurarme de que la aplicación no se bloquee con demasiadas actividades en la pila? ¡Gracias!
Ruchir Baronia

13

Agregue esto en su método onCLick (), volverá a su actividad anterior

terminar();

o puedes usar esto. Funcionó perfectamente para mí

 @Override
  public boolean onOptionsItemSelected(MenuItem item) {
  int id = item.getItemId();

      if ( id == android.R.id.home ) {
         finish();
         return true;
       }

  return super.onOptionsItemSelected(item);
  }

11

Si ha configurado correctamente el archivo AndroidManifest.xml con actividad principal, puede usar:

NavUtils.navigateUpFromSameTask(this);

Donde esta es la actividad de su hijo.


8

Prueba esto es actuar ya que tienes que presionar el botón Atrás

finish();
onBackPressed();


7

Tengo el mismo problema y

finish();  OR super.onBackPressed();

funcionó bien para mí, ambos funcionaron igual, pero no tuve suerte con return


6

Comience la segunda actividad con intención (ya sea de uso startActivityo de startActivityForResultacuerdo con sus requisitos). Ahora, cuando el usuario presione el botón Atrás, la actividad actual en la parte superior se cerrará y se mostrará la anterior.

Ahora digamos que tiene dos actividades, una para seleccionar algunas configuraciones para el usuario, como idioma, país, etc., y después de seleccionarla, el usuario hace clic en el botón Siguiente para ir al formulario de inicio de sesión (por ejemplo). Ahora, si el inicio de sesión no es exitoso, el usuario estará en la actividad de inicio de sesión, ¿qué sucede si el inicio de sesión es exitoso?

Si el inicio de sesión es exitoso, entonces debe comenzar otra actividad. Significa que se iniciará una tercera actividad, y aún hay dos actividades en ejecución. En este caso, será bueno usarlo startActivityForResult. Cuando el inicio de sesión sea exitoso, envíe datos OK nuevamente a la primera actividad y cierre la actividad de inicio de sesión. Ahora, cuando se reciben los datos, inicie la tercera actividad y cierre la primera actividad utilizando finalizar.


Estoy haciendo que el usuario realice muchas actividades una tras otra a través de intentos. ¿Debo hacer algo para asegurarme de que la aplicación no se bloquee con demasiadas actividades en la pila? ¡Gracias!
Ruchir Baronia

5

Puedes probar esto:

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

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

4

Todas las actividades / intentos nuevos por defecto tienen un comportamiento anterior / anterior, a menos que haya codificado un finish()en la actividad de llamada.


4
@Override
public void onBackPressed() {
    super.onBackPressed();
}

y si quieres hacer clic en el botón regresar, simplemente pon

bbsubmit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        onBackPressed();
    }
});

3
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
      int id = item.getItemId();

      if ( id == android.R.id.home ) {
          finish();
          return true;
      }

      return super.onOptionsItemSelected(item);
 }

Pruebe esto, funciona tanto en el botón de retroceso de la barra de herramientas como en el botón de retroceso de hardware .


2

Sugiero NavUtils.navigateUpFromSameTask (), es fácil y muy simple, puedes aprenderlo del desarrollador de Google. ¡Ojalá pudiera ayudarte!


1

Hay algunos casos para volver a su actividad anterior:

Caso 1: si desea volver a su actividad anterior, entonces ActivityA.java

 Intent intent = new Intent(ActivityA.this, FBHelperActivity.class);
               startActivityForResult(intent,2);

FBHelperActivity.java

 Intent returnIntent = new Intent();
 setResult(RESULT_OK, returnIntent);
 finish();

Caso 2: ActividadA -> FBHelperActivity ----> ActividadA

ActivityA.java

 Intent intent = new Intent(ActivityA.this, FBHelperActivity.class);
               startActivity(intent);

FBHelperActivity.java

after getting of result call finish();
 By this way your second activity will finish and because 
 you did not call finish() in your first activity then
 automatic first activity is in back ground, will visible.

1

Primero, lo que debe tener en cuenta es que, si desea volver a una actividad anterior. Entonces no llame al método finish () cuando vaya a otra actividad usando Intent.

Después de eso, tiene dos formas de retroceder de la actividad actual a la actividad anterior:

Simplemente llame: finish()debajo del botón haga clic en escucha, o anule el siguiente método para retroceder usando el botón de retroceso del sistema:

@Override
public void onBackPressed() {
    super.onBackPressed();
}

0

Además de todas las respuestas mencionadas, sigue siendo una forma alternativa de hacerlo, digamos que tiene dos clases, clase A y clase B.

Clase A, ha realizado algunas actividades, como seleccionar la casilla de verificación, imprimir algunos datos e intentar la clase B. Clase B, le gustaría pasar varios valores a la clase A y mantener el estado anterior de la clase A, puede usar, pruebe esta alternativa método o descargue el código fuente para demostrar esto

http://whats-online.info/science-and-tutorials/125/Android-maintain-the-previous-state-of-activity-on-intent/

o

http://developer.android.com/reference/android/content/Intent.html


0

Solo intenta esto en la primera actividad

Intent mainIntent = new Intent(Activity1.this, Activity2.class);
this.startActivity(mainIntent);

En tu segunda actividad

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

sigue fallando, los datos no persisten creo
john ktejik
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.