[Android] Matar activitiES desde otra

willy_chaos

Hola a todos, en la app que estoy desarrollando me encuentro con que tengo que eliminar unas activities de la pila de activities de android.

La cosa es que tengo un asistente paso a paso para crear una asignatura, y me interesa que cuando termine el asistente y se cree dicha actividad me vaya a una activity donde muestra el listado.

Tengo dos rutas desde donde añadir una nueva asignatura

Desde el listado de asignaturas

Menu principal -> Listado asignaturas -> Añadir asignaturas -> Nueva asignatura 1/3 -> Nueva asignatura 2/3 -> Nueva asignatura 3/3 -> Listado de asignaturas

Desde el menu principal

Menu principal -> Añadir asignaturas -> Nueva asignatura 1/3 -> Nueva asignatura 2/3 -> Nueva asignatura 3/3 -> Listado de asignaturas

La cosa es cuando termine el asistente debo volver al listado de asignaturas ELIMINANDO todas las pantallas del asistente de la pila para que cuando se haga back, no muestre el asistente de nuevo.

Para hacer esto hacia uso del

Intent in = new Intent(getApplicationContext(),ListCourseActivity.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(in);
finish();

Pero que pasa? Que si vengo del listado de asignaturas, como esta cargado en pila, se limpia (CLEAR_TOP) todo lo que esta tiene por encima (los asistentes) y me devuelve al listado, si hago back, vuelvo al mainmenu.

El problema es si vengo del mainMenu, como ListadoAsignaturas no esta en la pila, cuando acaba el asistente la lanza al principio de la pila, con lo que al hacer CLEAR_TOP no estoy borrando nada ya que los otras dos activity (asis1, asis2) estan por debajo de esta.

Se me ha ocurrido que si entran a crear asignatura desde el main menu, lanzar la activity de listado y pasarle un putExtra indicando si debe quedarse como tal, o ella misma lanzar la de crear asignatura.... pero quiza hay una forma mas limpia y profesional de hacer esto no ?

M

Yo hice un asistente paso a paso utilizando un ViewPager con fragments, asi simplemente usas una activity y ademas ya tienes la animacion cuando pasas de una pagina a otra. Me parece una solucion mas limpia.

TeRRo90

#1 ¿Por que no haces lo mismo pero con fragments?, es decir, Tu creas un Activity con N fragments y cuando termines con que solo hagas activity.finish() eliminaras el activity que contiene los fragments. De esta manera te quitas el hecho de tener tantos activity's.

1 respuesta
zoeshadow

La verdad es que como dice #3 parece que tu problema se solucionaría de la manera más limpia posible.

En el único caso donde me he encontrado la necesidad de terminar activities además de la anterior es cuando logas/deslogas a un usuario, ya que no quieres que pueda acceder a las actividades para usuarios anonimos/logados, en mi caso lo resolví usando un Event Bus que se llamaba otto, lanzaba un evento de "logout" y todas las actividades que podían estar abiertas se finalizaban así mismas.

willy_chaos

Mmm interesante me lo voy a mirar y tratare de implementarlo

Tig

También te puede interesar IntentCompat.makeRestartActivityTask

Aquí un ejemplo de como se usa

http://stackoverflow.com/questions/19182233/how-to-use-intentcompat-makerestartactivitytask/19314733#19314733

freskito24

1) Marcas tu actividad como SingleTask en el manifest -> sólo una instancia
2) Cuando lances el intent usa el flag CLEAR_TOP -> Si esta en el stack quita las que hay por encima y la arranca (primer caso), si no el flag no tiene efecto extra (segundo caso)