Termina una actividad de otra actividad

101

Quiero terminar una actividad de otra actividad, como:

En la Actividad [A], al hacer clic en el botón, estoy llamando a la Actividad [B] sin terminar la Actividad [A].

Ahora, en la Actividad [B], hay dos botones, Nuevo y Modificar . Cuando el usuario hace clic en modificar, saca una actividad [A] de la pila con todas las opciones marcadas.

Pero cuando el usuario haga clic en el botón Nuevo de la Actividad [B], tendré que terminar la Actividad [A] de la pila y volver a cargar esa Actividad [A] en la pila.

Lo estoy intentando, pero no puedo terminar la Actividad [A] de la pila ... ¿Cómo puedo hacerlo?

Estoy usando el código como:

De la actividad [A]:

Intent GotoB = new Intent(A.this,B.class);
startActivityForResult(GotoB,1);

Otro método en la misma actividad

public void onActivityResult(int requestCode, int resultCode, Intent intent) {

    if (requestCode == 1)
    {
        if (resultCode == 1) {
            Intent i = getIntent();
            overridePendingTransition(0, 0);
            i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            finish();

            overridePendingTransition(0, 0);
            startActivity(i);
        }
    }
}

Y en la Actividad [B], al hacer clic en el botón:

setResult(1);
finish();
Kanika
fuente
oye, querías terminar una actividad de otra bien ... luego publiqué la respuesta que es correcta. Pero, ¿por qué lo rechazó?
Manjunath
Hay un hilo con algunas buenas respuestas aquí: stackoverflow.com/questions/14355731/…
ab

Respuestas:

189
  1. Haga su actividad A en el archivo de manifiesto: launchMode = "singleInstance"

  2. Cuando el usuario hace clic en nuevo, hazlo FirstActivity.fa.finish();y llama al nuevo Intent.

  3. Cuando el usuario haga clic en modificar, llame al nuevo Intent o simplemente finalice la actividad B.

PRIMERA MANERA

En tu primera actividad, declara una Activity objectcomo esta,

public static Activity fa;
onCreate()
{
    fa = this;
}

ahora usa ese objeto en otro Activitypara terminar la primera actividad como esta,

onCreate()
{
    FirstActivity.fa.finish();
}

SEGUNDA MANERA

Mientras llama a su actividad FirstActivityque desea finalizar tan pronto como continúe, puede agregar una bandera mientras llamaFirstActivity

intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

Pero al usar esta bandera, la actividad se terminará incluso si no lo desea. y en algún momento, onBacksi desea mostrar el FirstActivity, tendrá que llamarlo usando intent.

MKJParekh
fuente
6
Gran respuesta..!!
Vaibhav Vajani
93
Tienes una referencia estática a una actividad. Esto nunca desaparecerá a menos que lo borre manualmente desde algún lugar -> ¡está creando una pérdida de memoria!
DArkO
5
Bueno, está bien, tienes mi +1 para pensar de inmediato: D, simplemente cambiaría a singleTop. sin embargo, todavía no será mi primera opción al hacer algo similar. por código de limpieza me refiero a una forma de deshacerse de la referencia estática para que no haya fugas de memoria, pero eso depende de la estructura de la aplicación.
DArkO
6
Por favor, nadie use la primera solución, es completamente incorrecta. Estás eludiendo el marco de Android de una manera realmente hacky mientras creas un objeto zombie. Utilice un BroadcastReceiver.
S-K
1
Soluciones increíbles. Funcionó muy bien para mi problema en el que pasaba de las actividades A-> B-> C y en onBackPressed de C, estaba lanzando una nueva instancia de B. Pero luego, si lo hacía onBackPressed en esa nueva instancia de B, solía vaya a la instancia anterior de B en lugar de la instancia anterior de A (lo que quería). Así que seguí su primer método en el onBackPressed de C, y me dio el comportamiento que quería :) Muchas gracias :)
SoulRayder
87

Eso puede hacer, pero creo que no debe interrumpir el flujo normal de actividad. Si desea finalizar su actividad, simplemente puede enviar una transmisión de su actividad B a la actividad A.

Cree un receptor de transmisión antes de comenzar su actividad B:

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context arg0, Intent intent) {
        String action = intent.getAction();
        if (action.equals("finish_activity")) {
            finish();
            // DO WHATEVER YOU WANT.
        }
    }
};
registerReceiver(broadcastReceiver, new IntentFilter("finish_activity"));

Envíe la transmisión de la actividad B a la actividad A cuando desee finalizar la actividad A de la B

Intent intent = new Intent("finish_activity");
sendBroadcast(intent);

Espero que funcione para ti ...

Bharat Sharma
fuente
Muestra este error "Error de sintaxis en tokens, se esperaba AnnotationName en su lugar" en "registerReceiver (broadcast_reciever, new IntentFilter (" finish_activity "));". ¿Qué pasa?
Behzad
2
"No debes interrumpir el flujo normal de actividad" +1 para esto
S-K
11
No te olvides de broadcast_receiverunregisterReceiver()
cancelar el
Esta es la solucion. agradable
Parinda Rajapaksha
17

Esta es una pregunta de comunicación bastante estándar. Un enfoque sería utilizar un ResultReceiver en la Actividad A:

Intent GotoB=new Intent(A.this,B.class);
GotoB.putExtra("finisher", new ResultReceiver(null) {
    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        A.this.finish();
    }
});
startActivityForResult(GotoB,1);

y luego en la Actividad B puedes terminarlo a pedido así:

((ResultReceiver)getIntent().getExtra("finisher")).send(1, new Bundle());

Intenta algo así.

Femi
fuente
6
+1 solo, ((ResultReceiver) getIntent (). GetParcelableExtra ("finisher")). Send (1, new Bundle ());
Hamidreza Sadegh
12

Hay un enfoque que puede utilizar en su caso.

Paso 1: Inicie la Actividad B desde la Actividad A

startActivity(new Intent(A.this, B.class));

Paso 2: Si el usuario hace clic en el botón Modificar, inicie la Actividad A usando el FLAG_ACTIVITY_CLEAR_TOP.Además, pase el indicador adicional.

Intent i = new Intent(B.this, A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("flag", "modify");
startActivity(i);
finish();

Paso 3: Si el usuario hace clic en el botón Agregar, inicie la Actividad A usando el FLAG_ACTIVITY_CLEAR_TOP.Además, pase la marca adicional. FLAG_ACTIVITY_CLEAR_TOPborrará todas las actividades abiertas hasta el objetivo y se reiniciará si no se define ningún modo de lanzamiento en la actividad objetivo

Intent i = new Intent(B.this, A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("flag", "add");
startActivity(i);
finish();

Paso 4: Ahora el onCreate()método de la Actividad A, necesita recuperar esa bandera.

String flag = getIntent().getStringExtra("flag");
if(flag.equals("add")) {
    //Write a code for add
}else {
    //Write a code for modifying
}
Dharmendra
fuente
6

Inicie su actividad con el código de solicitud:

StartActivityForResult(intent,1234);

Y puedes cerrarlo de cualquier otra actividad como esta:

finishActivity(1234);
yaniv maymon
fuente
¿¿En que idioma??
Morten Holmgaard
5

Vea mi respuesta a la pregunta de Stack Overflow Finalizar todas las actividades anteriores .

Lo que necesita es agregar el Intent.FLAG_CLEAR_TOP. Esta bandera asegura que todas las actividades por encima de la actividad objetivo en la pila estén terminadas y que se muestre.

Otra cosa que necesitas es la SINGLE_TOPbandera. Con este evitas que Android cree una nueva actividad si ya hay una creada en la pila.

Solo tenga cuidado de que si la actividad ya se creó, la intención con estos indicadores se entregará en el método llamado onNewIntent(intent)(debe sobrecargarlo para manejarlo) en la actividad de destino.

Luego onNewIntent, tiene un método llamado reiniciar o algo que llamará finish()y lanzará una nueva intención hacia sí mismo, o tendrá un repopulate()método que establecerá los nuevos datos. Prefiero el segundo enfoque, es menos costoso y siempre puede extraer la onCreatelógica en un método separado que puede llamar para completar.

DArkO
fuente
4

Acabo de aplicar la solución de Nepster y funciona de maravilla. Hay una pequeña modificación para ejecutarlo desde un fragmento.

A tu fragmento

// sending intent to onNewIntent() of MainActivity
Intent intent = new Intent(getActivity(), MainActivity.class);
intent.putExtra("transparent_nav_changed", true);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Y a su OnNewIntent () de la Actividad que le gustaría reiniciar.

// recreate activity when transparent_nav was just changed
if (getIntent().getBooleanExtra("transparent_nav_changed", false)) {
    finish(); // finish and create a new Instance
    Intent restarter = new Intent(MainActivity.this, MainActivity.class);
    startActivity(restarter);
}
koras
fuente
2

Creo que tengo el enfoque más fácil ... al presionar nuevo en B ..

Intent intent = new Intent(B.this, A.class);
intent.putExtra("NewClicked", true);
 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

y en A consíguelo

  if (getIntent().getBooleanExtra("NewClicked", false)) {
        finish();// finish yourself and make a create a new Instance of yours.
      Intent intent = new Intent(A.this,A.class);
      startActivity(intent);
    }
AndroidGeek
fuente
1

Sé que esta es una pregunta antigua, algunos de estos métodos no funcionaron para mí, así que para cualquiera que busque en el futuro o tenga mis problemas, esto funcionó para mí.

Anulé onPausey llamé finish()dentro de ese método.

Tony Kutzler
fuente
-1

Primero llame y startactivity()luego usefinish()

Dharmik Ghori
fuente