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?

Troj
fuente
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.

Abhinav
fuente
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.

adamp
fuente
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.

Umer Rana
fuente
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();
AtanuCSE
fuente
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

Dmitry Ryadnenko
fuente
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

Bryan Denny
fuente
19

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

finish();

O

onBackPressed();
Akshay Paliwal
fuente
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);
Ram G.
fuente
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);
  }
Darshuu
fuente
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.

Thomas Decaux
fuente
8

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

finish();
onBackPressed();
Muhammed Fasil
fuente
7

Tengo el mismo problema y

finish();  OR super.onBackPressed();

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

Sin nombre
fuente
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.

Altaf Hussain
fuente
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);
}
nikki
fuente
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.

ameyx
fuente
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();
    }
});
MD Hussain
fuente
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 .

Puni
fuente
2

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

wuxue
fuente
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.
Gyan Swaroop Awasthi
fuente
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();
}
Monir Zzaman
fuente
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

Daniel Nyamasyo
fuente
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();
}
byteC0de
fuente
sigue fallando, los datos no persisten creo
john ktejik