Cómo cerrar la actividad y volver a la actividad anterior en Android

144

Tengo una actividad principal, que cuando hago clic en un botón, comienza una nueva actividad, utilicé el siguiente código para hacerlo:

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

El código anterior se ejecutó desde la actividad principal.

Ahora en mi nueva actividad que es llamada por la actividad principal, tengo un botón de retroceso. Cuando hago clic en este botón Atrás, quiero que se cierre mi nueva actividad y debe volver a la actividad principal original.

He intentado llamar super.finish()y solo finish() (de la nueva actividad) pero luego cierra toda mi aplicación (incluida mi actividad principal).

¿Cómo puedo cerrar la actividad que está actualmente enfocada y luego volver a la actividad principal?

EDITADO

El hecho de que el botón de retroceso de mi teléfono también cierre toda mi aplicación, ¿me lleva a pensar que he iniciado la segunda actividad de forma incorrecta?


Ok he estado buscando

Creé una actividad de configuración que usa el mismo código de manifiesto y el mismo código para iniciar la actividad.

Para la configuración Actividad cuando presiono el botón Atrás, vuelve a la actividad Principal.

Con la actividad mencionada anteriormente en la pregunta principal, simplemente sale de toda mi aplicación.

Entonces, el problema no parece estar en el código para finalizar la actividad, sino en la actividad misma.

Zapnologica
fuente
44
Ni siquiera necesita un botón de retroceso, solo deje que el usuario use la tecla de retroceso del teléfono y no tiene que hacer nada.
Hoan Nguyen
El botón de retroceso de teléfonos cierra la aplicación de entrada, no solo mi actividad secundaria. No quiero cerrar la actividad principal.
Zapnologica
1
El botón 'atrás' no debería hacer eso, ¿puede mostrar más de su código?
peejaybee
En respuesta a su edición, la actividad secundaria se ve bien por lo que ha publicado. Creo que TGMCians probablemente tenga la respuesta correcta e investigue su manifiesto.
peejaybee
mira esta respuesta, creo que esto te ayudará
Muhammad Helmi

Respuestas:

201

Creo que estás llamando al finish()método MainActivityantes de comenzar SettingsActivity.

El escenario que ha descrito se producirá de las siguientes dos maneras:

YA SEA

Ha configurado android:noHistory = "true"para MainActivityadentro lo AndroidManifest.xmlque hace MainActivityque finishse presione automáticamente la tecla Atrás.

O

Antes de cambiar a su 'ConfiguraciónActividad', ha llamado finish()a su MainActivity, que lo mata. Cuando presiona el botón Atrás, dado que ninguna otra actividad está preestablecida en la pila para aparecer, vuelve a la pantalla principal.

Ajay S
fuente
Eso explicaría por qué el botón 'atrás' del teléfono también descarta la actividad principal.
peejaybee
Al depurar, noté que la ejecución continúa después de terminar (), por lo que es aconsejable agregar un retorno además.
hasta el
¿No es la tercera razón en esta respuesta solo una repetición de la primera?
Pang
60

Puede volver a la actividad anterior simplemente llamando a finish () en la actividad en la que se encuentra. Tenga en cuenta cualquier código después de que se ejecute la llamada finish (): puede hacer una devolución después de llamar a finish () para solucionar esto.

Si desea devolver los resultados a la actividad uno, al iniciar la actividad dos necesita:

startActivityForResults(myIntent, MY_REQUEST_CODE);

Dentro de su actividad llamada, puede obtener la intención del parámetro onCreate () o usar

getIntent();

Para establecer devolver un resultado a la actividad uno, luego en la actividad dos

setResult(Activity.RESULT_OK, MyIntentToReturn);

Si no tiene intención de regresar, simplemente diga

setResult(Activity.RESULT_OK);

Si la actividad tiene malos resultados, puede usar Activity.RESULT_CANCELED (esto se usa por defecto). Luego en la actividad uno haces

onActivityResult(int requestCode, int resultCode, Intent data) {
    // Handle the logic for the requestCode, resultCode and data returned...
}

Para finalizar la actividad dos, use los mismos métodos con finish () como se describió anteriormente con los resultados ya establecidos.

jjNford
fuente
1
"Tenga en cuenta cualquier código después de que se ejecute la llamada de finalización (); simplemente puede hacer una devolución después de llamar a finalización () para arreglar esto" Creo que 'corregir' es una mala elección de palabras aquí. Es más como si estuvieras evitando la ejecución de las siguientes líneas (no arreglando).
Lo-Tan
14

Cuando hace clic en su botón, puede hacer que llame:

super.onBackPressed();
Zabador
fuente
11

si usas fragmento deberías usar

getActivity().onBackPressed();

si usas una sola actividad puedes usar

finish();
Osama Ibrahim
fuente
7

prueba este código en lugar de finish:

onBackPressed();

Sanaz Afzali
fuente
2
Funciona bien para volver de ActivityB a ActivityA. Para fragmentos y actividades individuales podría usar la respuesta de @Osama Ibrahim.
Eftekhari
4
Button edit = (Button) view.findViewById(R.id.yourButton);
edit.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this, YourMainActivity.class);
        startActivity(intent);
        finish();
    }
});
KEYSAN
fuente
4

Esto cierra toda la aplicación:

this.finish();
Logar314159
fuente
Esto cierra toda la aplicación como se indica en la pregunta, no solo la actividad actual, ¿como hace el botón de retroceso del teléfono?
Zapnologica
¿Cómo llegué a la actividad anterior de la actividad de la cámara?
coderpc
2
No lo hace Solo cierra la actividad actual. Ver: developer.android.com/reference/android/app/…
Firzen
4

Creo que su segunda actividad probablemente no esté vinculada a su actividad principal como actividad secundaria. Verifique su AndroidManifest.xmlarchivo y vea si la <activity>entrada para su actividad secundaria incluye un android:parentActivityNameatributo. Debería verse más o menos así:

<?xml ...?>
...
<activity
    android:name=".MainActivity"
    ...>
</activity>
<activity
    android:name=".ChildActivity"
    android:parentActivityName=".MainActivity"
    ...>
</activity>
...
Trevor
fuente
1

Simplemente no llame finish()a su MainActivityentonces esto elimina la necesidad de anular su onBackPressed()en su a SecondActivitymenos que esté haciendo otras cosas en esa función. Si siente la "necesidad" de este botón de retroceso, simplemente puede llamar finish()al SecondActivityy eso lo llevará a su cuenta MainActivitysiempre que no lo haya llamado finish().

codeMagic
fuente
Intenté esta ruta, pero tengo unas 10 pantallas en secuencia que usan PNG de alta resolución. El problema es que, en torno a la pantalla 7, el dispositivo se quedó sin memoria debido a todas las actividades en la pila de reserva. Decidí llamar al final de cada actividad, y esto solucionó el problema al permitir la recolección de basura, pero ahora el comportamiento posterior debe codificarse manualmente porque la pila posterior ahora está vacía. ¿Te has encontrado con este problema o conoces algún mecanismo en Android para solucionarlo?
Lo-Tan
¿Qué quieres que haga el botón Atrás? ¿Volver a lo que Activityfue el anterior o siempre volver al MainActivity? Además, si se está quedando sin memoria Bitmaps, debería leer Esta parte de Documentos . Me ayudó
codeMagic
@ Lo-Tan si desea volver a la actividad anterior, entonces creo que necesita averiguar la administración de memoria para sus imágenes y no finalizar las actividades (tal vez con el enlace que proporcioné). De lo contrario, tendrá que recrear una nueva instancia de la actividad e intentar averiguar a cuál volver
codeMagic
Me gustaría que el botón de retroceso solo vaya a la pantalla anterior. Esta es una serie de pantallas de tutoría, básicamente, y el usuario puede avanzar / retroceder. Cada pantalla está diseñada y usa muchos pngs, a veces pngs que ocupan la mayor parte de la pantalla (no solo pequeñas miniaturas), por lo que absorbe mucha memoria para cada pantalla.
Lo-Tan
@ Lo-Tan Creo que desea anular el método onBackPressed () y luego crear manualmente la actividad a la que desea ir. A continuación, puede finalizar el que está encendido e iniciar el anterior.
Zapnologica
1

No sé si esto es útil o no, pero estaba luchando con el mismo problema y encontré una manera bastante fácil, con solo una variable booleana global y acción onResume (). En mi caso, mi Actividad C si se hace clic en un botón específico, ¡debería activar el final () de la Actividad B!

Actividad_A -> Actividad_B -> Actividad_C

Actividad_A (se abre normalmente Actividad_B)

Actividad_B (al hacer clic en un botón, se abre Actividad_C):

// Global:
boolean its_detail = false;
// -------
SharedPreferences prefs =  getApplicationContext().getSharedPreferences("sharedpreferences", 0);
boolean v = prefs.getBoolean("select_client", false);

its_detail = v;

startActivity(C);

@Override
public void onResume(){
     super.onResume();
     if(its_detail == true){
        finish();
     }
}

Entonces, cada vez que hago clic en el botón de la Actividad C, haría la función "onResume ()" de la Actividad B y volvería a la Actividad A.

usuario2742861
fuente
1
 @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
Este me funcionó. También tuve una MainActivity y una SettingsActivity con android:parentActivityName=".MainActivity"la segunda. Este código maneja ese botón de Inicio / Atrás en la barra de herramientas y simplemente finaliza la actividad actual volviendo a la anterior en la pila. Gracias.
mortalis
1

Finish cierra toda la aplicación, esto es algo que odio en el desarrollo de Android, no terminar, está bien, pero no se mantienen con la sintaxis correcta que tienen

startActivity(intent)

Por qué no

closeActividad (intento)?

Kent Hansen
fuente
1
¿Responde esto la pregunta? ¿O es solo una sugerencia para probar? En ambos casos, la diatriba es innecesaria y probablemente no sea bienvenida en SO
Gilles Gouaillardet
1

Nos encontramos con una situación muy similar.

Actividad 1 (Apertura) -> Actividad 2 (Vista previa) -> Actividad 3 (Detalle)

Respuesta incorrecta "al presionar hacia atrás"

  • Al presionar nuevamente el dispositivo en la Actividad 3, también se cerrará la Actividad 2.

He verificado todas las respuestas publicadas anteriormente y ninguna de ellas funcionó. La sintaxis de Java para la transición entre la Actividad 2 y la Actividad 3 se revisó para que sea correcta.

Recién llegado de la codificación al llamar a una aplicación de terceros. por una actividad. Decidimos investigar el ángulo de configuración, lo que finalmente nos permitió identificar la causa raíz del problema.

Alcance : Configuración de la Actividad 2 (llamante).

Causa raíz :

android:launchMode="singleInstance"

Solución :

android:launchMode="singleTask"

Aparentemente, en este tema "al presionar hacia atrás", singleInstance considera las Actividades invocadas en una instancia con la Actividad que realiza la llamada, mientras que singleTask permitirá que las Actividades invocadas tengan su propia identidad suficiente para que la función de presionar hacia atrás funcione como debería.

Cuervo
fuente
0
{ getApplicationContext.finish();   }

Prueba este método ...

Abhishek
fuente
Si bien este bloque de código puede responder la pregunta, sería mejor si pudiera proporcionar una pequeña explicación de por qué lo hace.
David
0

puede ser posible que esté llamando a finish (); en el evento de botón de clic para que la actividad principal se cierre justo después de hacer clic en el botón y cuando regrese de la siguiente actividad, la aplicación se cierra porque la actividad principal ya está cerrada y no hay actividad activa.

raman rayat
fuente
0

en el método onCreate de su actividad, escriba el siguiente código.

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

Luego, anule el método seleccionado de onOptionsItem de su actividad de la siguiente manera

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case android.R.id.home:
            finish();
    }
    return super.onOptionsItemSelected(item);
}

Y eres bueno para ir.

Hagos Alema
fuente
0

Tienes que usar esto en tu MainActivity

 Intent intent = new Intent(context , yourActivity);

            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
            context.startActivity(intent);

El indicador iniciará múltiples tareas que mantendrán su actividad principal, cuando llame al finalizar matará la otra actividad y lo llevará de regreso a la actividad principal

Rafat
fuente