2011-05-12 15 views
39

Tengo una actividad de pantalla de inicio, luego una actividad de inicio de sesión. Mi pila de la historia es así:¿Borrar todas las actividades en una tarea?

SplashActivity 
LoginActivity 

cuando el usuario inicia una sesión con éxito en medio de LoginActivity, quiero empezar WelcomeActivity, pero borrar toda la pila:

SplashActivity 
LoginActivity // launches WelcomeActivity -> 
WelcomeActivity 

// but now all three are in the history stack, while I only 
// want WelcomeActivity in the stack at this point. 

¿Hay alguna bandera que puedo utilizar para hacer ¿ese?

// LoginActivity.java 
Intent intent = new Intent(this, WelcomeActivity.class); 
intent.addFlag(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
startActivity(intent); 
finish(); 

No está seguro de si se utiliza el FLAG_ACTIVITY_CLEAR_TASK despejará a cabo todas las actividades en mi tarea o no. Puedo hacer esto 'manualmente' desenrollando la pila usando las llamadas a startActivityForResult(), pero será más frágil y más código para mantener.

Gracias

+2

"No estoy seguro si se utiliza el FLAG_ACTIVITY_CLEAR_TASK despejará a cabo todas las actividades en mi tarea o no." - usa el botón ATRÁS y comprueba por ti mismo. Si puede volver a las actividades anteriores con el botón ATRÁS, entonces todavía estaban en la pila de respaldo. –

+1

La respuesta es usar 'FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK', ¿no es así? –

+0

Hay un error tipográfico en el código ... debe ser '.addFlags (...)' not '.addFlag'. – Developer

Respuesta

38

Sí que debería funcionar bien. Se podría utilizar:

  • FLAG_ACTIVITY_CLEAR_TOP
  • FLAG_ACTIVITY_SINGLE_TOP
  • FLAG_ACTIVITY_CLEAR_TASK
  • FLAG_ACTIVITY_NEW_TASK

que asegura que si una instancia ya está en marcha y no es de primera luego nada encima de él, serán borrado y se usará, en lugar de comenzar una nueva instancia (esto es útil una vez que hayas ido Actividad de bienvenida -> Actividad A y luego quieras obtener b acepta dar la Bienvenida desde A, pero las banderas adicionales no deberían afectar tu caso anterior).

+12

Tenga en cuenta que deberá usar FLAG_ACTIVITY_NEW_TASK con FLAG_ACTIVITY_CLEAR_TASK. – Femi

+0

Sí, mi mal, generalmente solo uso 'NEW_TASK'. Editado con su corrección. –

+0

Todo bien: ni siquiera se dieron cuenta de que tenían CLEAR_TASK, así que fueron y lo revisaron. Es bueno saberlo – Femi

6

Intent.FLAG_ACTIVITY_NO_HISTORY puede trabajar en su caso también si no se desea que la actividad en la pila de la historia.

8

finish() elimina la actividad de la pila. Por lo tanto, si se inicia LoginActivity y llamar finish() en SplashActivity, y luego lo hace exactamente lo mismo que empezar WelcomeActivity obtendrá el comportamiento deseado. No es necesario usar banderas adicionales.

+0

Esto funciona y parece ser la solución más limpia para 2.3. ¡Gracias! – jskierbi

8

Uso android:noHistory="true" sobre la actividad de bienvenida en el archivo de manifiesto.

<activity 
android:name=".activity.SplashActivity" 
android:theme="@style/theme_noActionBar" 
android:noHistory="true"> 
+0

para API menor que 11 no funciona –

4
Intent intent = new Intent(this, NextActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
        IntentCompat.FLAG_ACTIVITY_CLEAR_TASK); 
startActivity(intent); 
0
  • En caso de que todos los tres actividad está implicada en la misma aplicación (misma taskAffinity), se puede recoger o bien 1,2 o 3 a continuación. de lo contrario, debe elegir 1,2 a continuación.

    1. Si no quiere volver detrás de SplashActivity LoginActivity, se puede definir la actividad atribuyen noHistory en AndroidManifest.xml o puede establecer FLAG_ACTIVITY_NO_HISTORY en la intención de poner en marcha SplashActivity. si SplashActivity se inicia desde el Iniciador, debe elegir la forma de establecer el atributo de actividad noHistoria.

    2. Si no desea volver atrás LoginActivity de WelcomeActivity, puede usar el atributo de actividad noHistory o FLAG_ACTIVITY_NO_HISTORY como el número 1 anterior.

    3. Si desea borrar volver pila de la situación específica, se puede utilizar en conjunción con FLAG_ACTIVITY_CLEAR_TASK FLAG_ACTIVITY_NEW_TASK (FLAG_ACTIVITY_CLEAR_TASK siempre debe ser utilizado en conjunción con FLAG_ACTIVITY_NEW_TASK). Pero, si la actividad que se inicia está involucrada en otra aplicación (es decir, taskAffinity diferente), la tarea se iniciará en otra tarea una vez que se borre la tarea, no en la tarea actual. así que asegúrese de que la actividad que se inicia esté involucrada en la misma aplicación (taskAffinity).

Cuestiones relacionadas