Matar Activity desde un hilo

babri

Buenas estoy haciendo una APP en Android nativo y tengo un problema al matar una activity.

Para que veiais un poco el flujo la idea es que carga una activity Login, pulso en crear cuenta y abre una activity Register y cuando me registro abre un hilo RegisterHilo y si sale bien manda la info a LoginHilo y este último abre lo que sería el Dashboard activity.

Osea se:

Login > Register > RegisterHilo > LoginHilo > Dashborad

Solo consigo matar hasta Register y la activity de Login siempre se queda y no consigo matarla.

Espero haberme explicado mejor ^^

Un saludo y gracias!

MTX_Anubis

Si no recuerdo mal, hay flags para limpiar el task cuando lanzas una activity, con eso solucionarías el p roblema.

1 respuesta
ke2g

lo que dice mtx_anubis. Juraría que es esta:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

tienes que utilizarla al lanzar la activity Dashboard.

babri

#2 ya pero imaginate que quiero ir para atrás cuando abro Register si la quito de pila en ese momento no puedo volver para atrás.

2 respuestas
ke2g

#4 Si no entiendo mal lo que quieres es que cuando estés en Dashboard se quiten de la pila tanto la Activity Login como la de Register. Si pones la línea que he puesto en #3 se limpia toda la pila, con lo que al llamar Dashboard esta será la primera Activity de la pila. Si no la utilizas en otro sitio la pila no se modificará, es decir que si vienes des de login a register y luego vas atrás volverás a login.

2 respuestas
MTX_Anubis

#4 ya te lo ha dicho #5, pero lo suyo es limpiar el Task cuando lanzas Dashboard, no la de Register.

Otra opción es lanzar las activities esperando un resultado como dicen aquí

La idea es hacer un startActivityForResult con Register, cuando complete el registro devuelves los datos de login y realizas el login desde la activity de Login. Así, por decirlo de una manera, sigues el flujo normal de la app siempre y el login se hace desde donde tiene que hacerse (bajo mi punto de vista :P)

babri

#5 es lo primero que usé pero no elimina de pila las demás activity, lo lanzo desde el hilo de login.

1 respuesta
MTX_Anubis

#7 Si sigues con esa idea prueba con estos dos flags:

FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK

Cuando lances la activity de Dashboard.

Tig

flag_activity_clear_top sólo limpia la pila si esa actividad existe previamente en la pila de actividades, así que no te sirve (http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP).

FLAG_ACTIVITY_NEW_TASK va a crear una nueva TASK, pero loginActivity va a seguir en su propia pila, lo que no creo que te interese, pues dándole a Back el usuario volverá a la loginActivity, lo que no tiene sentido.

Para iniciar DashBoard desde Register, lo que te interesa es decir que la actividad que estás iniciando va a ser la Root de nuestra Task, y que limpie todo lo demás.

Intent intentToBeNewRoot = new Intent(context, classToStart);
    ComponentName cn = intentToBeNewRoot.getComponent();

Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);

context.startActivity(mainIntent);

Además, piensa que en el futuro querrás meter al tío directamente en Dashboard, y si primero vas a LoginActivity y luego lo metes en Dashboard va a quedar una transición rara. Yo te recomiendo que en el Manifest, como Activity que recibe el LAUNCHER, crees una actividad con un Theme sin display. Esto es lo que tengo yo

<style name="NoDisplay" parent="Theme.AppCompat">
        <item name="android:windowBackground">@null</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowAnimationStyle">@null</item>
        <item name="android:windowDisablePreview">true</item>
        <item name="android:windowNoDisplay">true</item>
    </style>

Dentro de esta actividad compruebas si el usuario está logueado o no, y entonces usas el código del primer punto para iniciar la Activity que será la principal de nuestra Task

1 2 respuestas
MTX_Anubis

#9 FLAG_ACTIVITY_CLEAR_TASK limpia y cierra todas las activities del task actual que usado junto con NEW_TASK te crea otro Task y la activity pasa a ser el root.

El resto de la solución me parece perfecta la verdad

1 respuesta
Tig

#10 Es verdad, pero esa flag la añadieron en Honeycomb, así que si te toca soportar Froyo, necesitas usar IntentCompat

En este blog explican el atributo android:launchMode, que puede ser un poco lío hasta que se comprende

http://inthecheesefactory.com/blog/understand-android-activity-launchmode/en

babri

#9 la primera actividad que lanzo es dashboard y ahí compruebo todo y lanzo a login si no tengo user (me han obligado básicamente jajja) pero creo que voy a tener que cambiar a eso para poder arreglar lo de la actividad fantasma xD