Pregunta sobre android-activity, android-intent, android – Terminar una actividad de otra actividad.

82

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 yModificar. Cuando el usuario haga clic en Modificar, aparecerá una actividad [A] de la pila con todas las opciones marcadas.

Pero cuando el usuario haga clic enNuevo botón de la Actividad [B], entonces tendré que terminar la Actividad [A] de la pila y volver a cargar esa Actividad [A] nuevamente 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]:

<code>Intent GotoB = new Intent(A.this,B.class);
startActivityForResult(GotoB,1);
</code>

Otro método en la misma actividad.

<code>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);
        }
    }
}
</code>

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

<code>setResult(1);
finish();
</code>
hey, querías terminar una actividad de la otra derecha ... luego publiqué la respuesta que es correcta. Pero, ¿por qué lo votaste? Manjunath
Hay un hilo con algunas respuestas agradables aquí:stackoverflow.com/questions/14355731/… a b

Tu respuesta

9   la respuesta
176

launchMode = "singleInstance"

Cuando el usuario haga clic en nuevo, hagaFirstActivity.fa.finish(); y llamar a la nueva Intención.

Cuando el usuario haga clic en Modificar, llame al nuevo Intención o simplemente finalice la actividad B.

PRIMER CAMINO

En tu primera actividad, declara una.Activity object Me gusta esto,

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

ahora usa ese objeto en otroActivity para terminar la primera actividad como esta,

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

SEGUNDO CAMINO

Mientras llamas tu actividadFirstActivity que desea finalizar tan pronto como avance, puede agregar una marca mientras llamaFirstActivity

intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

Pero usando esta bandera, la actividad se terminará incluso si no quieres. y alguna vezonBack si quieres mostrar elFirstActivity Tendrá que llamarlo con intención.

Es una buena solución. ¡Ayudó mucho! Can Uludağ
@Darko Sobre el problema de fugas que mencionó en la primera vía, si en_Destroy hacemos que el fa = null, ¿no lo eliminaría el recolector de basura del ram? Menelaos Kotsollaris
Gran respuesta..!! Vaibhav Vajani
Bueno, está bien, tienes mi +1 para pensar fuera de la caja: D, solo 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 deshacerme de la referencia estática para que no haya pérdida de memoria, pero eso depende de la estructura de la aplicación. DArkO
10

Paso 1: Comience la actividad B de 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 con la teclaFLAG_ACTIVITY_CLEAR_TOP.También, pase la bandera en extra.

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 con la teclaFLAG_ACTIVITY_CLEAR_TOP.También, pase la bandera en extra.FLAG_ACTIVITY_CLEAR_TOP borrará todas las actividades abiertas hasta el objetivo y se reiniciará si no se define un 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: AhoraonCreate() Método de la Actividad A, es necesario recuperar esa bandera.

String flag = getIntent().getStringExtra("flag");
if(flag.equals("add")) {
    //Write a code for add
}else {
    //Write a code for modifying
}
buena respuesta.... MKJParekh
1

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éonPause y llamadofinish() dentro de ese metodo

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 conseguirlo

  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);
    }
16

í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, puede terminarlo a pedido así:

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

Intenta som, ething así.

Gran respuesta +1 Sharp Edge
+1 solo, ((ResultReceiver) getIntent (). GetParcelableExtra ("finisher")). Send (1, new Bundle ()); Hamidreza Sadegh
+1 Genial. Esto es algo nuevo para mi. Dharmendra
No no esta funcionando Kanika
5

Mi respuesta a la pregunta de desbordamiento de pilaTerminar todas las actividades anteriores.

Lo que necesitas es agregar elIntent.FLAG_CLEAR_TOP. Este indicador garantiza que todas las actividades que se encuentran por encima de la actividad objetivo en la pila hayan finalizado y se muestre esa.

Otra cosa que necesitas es laSINGLE_TOP bandera. 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 estas banderas se entregará en el método llamadoonNewIntent(intent) (necesitas sobrecargarlo para manejarlo) en la actividad objetivo.

Entonces enonNewIntent Tienes un método llamado reinicio o algo que llamaráfinish() y lanzar un nuevo intento hacia sí mismo, o tener unarepopulate() Método que establecerá los nuevos datos. Prefiero el segundo enfoque, es menos costoso y siempre se puede extraer elonCreate lógica en un método separado que puede llamar para rellenar.

Gran respuesta DArko ... muy buena solución .... :) Chirag_CID
73

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 difusió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 B

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

Espero que funcione para ti ...

Muestra este error "Error de sintaxis en tokens, AnnotationName esperado en lugar" en "registerReceiver (broadcast_reciever, new IntentFilter (" finish_activity "));". Que pasa Behzad
Funciona bien, gracias! Nick
No te olvides de cancelar el registrobroadcast_receiver conunregisterReceiver() Jaec
2

StartActivityForResult(intent,1003);

Y puedes cerrarlo desde cualquier otra actividad como esta:

FinishActivity(1003);
4

y una modificación menor 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);
}

Preguntas relacionadas