2012-03-14 7 views
5

Tengo 5 actividades (digamos A,B,C,D y E). Las actividades de la A a la D son para configurar algunos datos, por lo que el usuario puede ir y venir cambiando lo que sea. Actividad E, por otro lado, es el resumen, por lo que el usuario ya no puede volver atrás.Android que acaba actividades anteriores para la navegación

Mi idea es terminar todas las actividades anteriores, cuando el usuario llega a E

Actualmente mis actividades A a D no tienen banderas unidos a ellos.

activty E se llama así:

Intent I = new Intent(this, SomeClass.class);

I.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

startActivity(I);

He leído todas partes que esas banderas se supone que para lograr lo que estoy tratando de hacer, pero no, cuando el usuario llega a la actividad E y presiona el botón Back, la aplicación vuelve a la actividad D .

¿Alguna idea? Me falta algo? ¿No es esta la manera correcta de resolver este problema?

Gracias por su ayuda

Respuesta

7

uso del método startActivityForResult en cada una de las actividades A, B, C, D en lugar de startActivity. Y cuando el usuario sale de la Actividad E, maneja el botón de retroceso y establece el código de resultado en el intento. ahora en el método onActivityResult de cada clase A, B, C y D lo manejan, cierre la actividad y pase el resultado a la actividad previa.

También puede hacerlo tan pronto como el usuario finalice la Actividad D. Cuando los usuarios van de D a E, puede usar el método anterior para descender hasta la Actividad A y luego abrir la actividad E y finalizar la Actividad A .

Ambos casos anteriores producen el mismo resultado desde la perspectiva de los usuarios y no ven las actividades intermedias A, B, C, D a menos que estén realizando trabajos largos en el método onStart de esas actividades.

+0

Fue un cambio fácil de hacer y funcionó, ¡muchas gracias! –

0

se debe redefinir el método onKeyDown() en Activit E e interceptar el evento de prensa clave para KEYCODE_BACK (la tecla de retroceso), y simplemente return true para indicar que manejaste la Volver evento . Ahora el usuario no podrá volver a la actividad anterior.

+0

Eso no lo hace. Eso está creando un problema que los usuarios no tienen la oportunidad de usar el botón Atrás, lo que va en contra de las mejores prácticas. Nunca bloquee el botón Atrás a menos que tenga una buena razón para hacerlo. Y en este caso, se evita que los usuarios salgan cuando hacen clic en el botón Atrás. – achie

0

cuando se inicia la actividad E, utilice este código:

Intent I = new Intent(this, SomeClass.class); 
I.putExtra("finish_all", true); 
I.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
startActivity(I); 
+0

Lo probé pero parece que no hace nada. ¿Es alguna bandera incorporada o algo así? ¿Debo tratarlo de alguna manera? –

3

supongo que tu estás tratando de escribir una especie de mago :)

Con el fin de usar la bandera FLAG_ACTIVITY_CLEAR_TOP debe tener la actividad E ya en la tarea de las actividades en curso.

Ejemplo: E-> A-> B-> C-> D -> si D iniciará E con CLEAR_TOP solo tendrá actividad E en la pila.

FLAG_ACTIVITY_CLEAR_TOP Usando CLEAR_TOP bandera para poner en marcha una actividad Si ya existe una instancia de la llamada Tipo de actividad presente en la pila, entonces este caso se lleva al primer plano en lugar de crear una nueva instancia. Además, todas las actividades en la pila que residen en la parte superior de esa instancia se borran de la pila. Por ejemplo, suponiendo que la pila de actividades actual es ABCDE, el inicio de una actividad de tipo C borrará las actividades D y E de la tarea y dará como resultado la pila ABC.

FLAG_ACTIVITY_SINGLE_TOP (no relevante en el escenario) Si una instancia de la actividad de destino ya está en la parte superior de la pila, no se crea ninguna nueva instancia.

+0

Su explicación me ayudó mucho a entender el uso real de esas banderas. En mi caso, llamar a E antes de A no era viable en este momento, pero lo tendré en cuenta para futuras aplicaciones. ¡Muchas gracias! –

5

Sólo en caso de que alguien necesita el código que @achie sugirió, aquí está:

A, B, C, D debe comenzar la siguiente actividad como esta:

Intent myIntent = new Intent(this, B.class); // Or C/D 
startActivityForResult(myIntent, 1); 

Además, una A, B, C, D debe anular:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == RESULT_OK && requestCode == 1) { 
     setResult(RESULT_OK); 
     finish(); 
    } 
} 

Entonces actividad de correo debe manejar botón de retroceso:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     setResult(RESULT_OK); 
    } 
    return super.onKeyDown(keyCode, event); 
} 
+0

¿Esto funcionó para usted? Necesito exactamente lo mismo que necesito, intenté con el código anterior, pero mi última actividad sigue volviendo a la actividad anterior. –

+0

Sí, esto está funcionando para mí. A navega hacia B, que navega hacia C, que navega hacia D, que navega hacia E, luego presiona hacia atrás y va a la pantalla de inicio porque todas las actividades han finalizado. He subido un ejemplo de proyecto de Android para ti: https://anonfiles.com/file/e9a7c889a7b2f358f29c868b7fa1d755 – fernandospr

+0

Gracias por tomarte el tiempo de publicarlo, pero ya he logrado que funcione. –

Cuestiones relacionadas