2011-02-15 19 views
21

Supongamos que tengo una aplicación que contiene actividades llamadas A, B, C, D. Ahora, considere que A ha sido lanzado como la actividad de raíz y B ha sido lanzado desde A y C ha sido lanzado desde B y D ha sido lanzado desde C. Ahora tengo un botón llamado "Eliminar" en la actividad D. Si supongo, Presiono el botón "Eliminar" en la actividad D, luego la actividad B y la actividad C deben eliminarse de la pila de historial. Al presionar la tecla atrás de la actividad, D debería mostrar la actividad A en lugar de C. No sé cómo implementar esto. ¿Alguien puede ayudarme a resolver este problema?¿Cómo borrar una actividad específica del historial de la pila?

Respuesta

29

no estoy seguro de que puede eliminar mediante programación directamente las actividades del historial, pero si se utiliza en lugar de startActivityForResult()startActivity(), a continuación, en función del valor de retorno de su actividad, a continuación, puede inmediatamente finish() la actividad predecesora para simular el comportamiento usted quiere. Al usar este método en todas sus actividades, puede tener este comportamiento en cascada en la pila de actividades para permitirle pasar de la actividad D a la actividad A.

Sé que esta no es su situación, pero en el futuro si conoce antes Cuando inicia la actividad que no desea que el predecesor permanezca, puede llamar al finish() inmediatamente después de startActivity().

Por favor, consulte la sección "Tiempo de vida de la nueva pantalla" en Common Tasks and How to do Them in Android

+0

El comentario sobre llamar a finish() inmediatamente después de startActivity() para que la actividad actual no permanezca en la pila es muy útil. Gracias. – dazed

19

Estoy de acuerdo con @RivieraKid, pero creo que de otra manera: Al pulsar "eliminar" se establece una marca personalizada en true.

anular el evento clave de vuelta:

public void onBackPressed() { 
    if (!remove){ 
    super.onBackPressed(); 
    }else{ 
    Intent goToA = new Intent((this,ActivityA.class);); 
    goToA.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(goToA); 
    } 
} 

¿Cree que esto hace lo que quiere?

Buena suerte.

+2

Flag Intent.FLAG_ACTIVITY_CLEAR_TOP está funcionando. Gracias. – anticafe

+0

Funcionó para mí también. – AB1209

+0

gracias yaar ........ funciona para mí – GvSharma

0

Creo que esto haría lo que quiera. En el archivo de manifiesto, simplemente agregue el atributo "noHistory" a las actividades "B" y "C" que no desea volver a visitar al presionar el botón Atrás en "D".

<activity android:name="com.acme.activityA"></activity> 

    <activity android:name="com.acme.activityB" 
       android:noHistory="true"></activity> 

    <activity android:name="com.acme.activityC" 
       android:noHistory="true"></activity> 

    <activity android:name="com.acme.activityD"></activity> 
0

Una alternativa es crear una clase para tener acceso a las actividades y cerrarlas. Ejemplo:

Actividades:

  • ACT1
  • ACT2
  • ACT3

clase Control:

public class ActivitiesControl { 

    public static act1 vAct1 = null; 
    public static act2 vAct2 = null; 
    public static act3 vAct3 = null; 
} 

En el onCreate de cada actividad se establece: ActivitiesControl.vAct1 = this;

y onDestroy(): ActivitiesControl.vAct1 = null;

Cuando se quiere destruir alguna actividad para sacarlo de la stackHistory que acaba de llamar:

ActivitiesContro.vAct1.finish();

No sé si este es el mejor método, pero es lo que funcionó para mí.

+2

rly mala idea pérdida de memoria probablemente ocurrirá –

1

Cuando inicia la aplicación. Todas las actividades se inician en la misma tarea por defecto. Entonces la pila de respaldo se ve como a continuación.

Tarea: A-> B-> C-> D en este caso el principio de la pila de vuelta está apuntando a "D"

Ahora, cuando si usted quiere hacer el punto superior a "A" de nuevo . Sólo declarar el atributo

android:launchMode="singleTask" 

para la actividad "A" en su AndroidManifest.xml

Ahora, cuando se pulsa el botón "Eliminar" en la actividad "D" acaba de iniciar la actividad como de costumbre como usted hacer. La pila de vuelta se borra de la actividad "B" y "C" y se obtiene una salida limpia de la actividad "A"

Recuerde esto cerrará y destruir su actividad D de la memoria incluso si usted no llama finish() explícitamente en "D"

Cuestiones relacionadas