2011-05-16 16 views
5

Tengo una aplicación que da vueltas alrededor de la actividad principal (un menú principal). En cada otra aplicación hay un elemento de menú de opción que dirige a esta actividad.Android: launchMode = SingleTask problem

Al principio, siempre comencé una nueva actividad principal cuando se seleccionaba este elemento. Usando el paquete de intención, le dije a la actividad principal que algunas inicializaciones que hago en un nuevo comienzo no eran necesarias.

Sin embargo, no me gustó el comportamiento general. Me encontré con android:launchMode="SingleTask" y esto pareció ayudar: ahora no recreo mi actividad de menú principal todo el tiempo; Además, si presiono el botón "volver", vuelvo directamente a la pantalla de inicio. Esto se siente muy bien como un menú "principal" adecuado.

Mi problema ahora es este: si ejecuto otra actividad de mi aplicación, presiono el botón de inicio y luego vuelvo a abrir mi aplicación (por ejemplo, usando "últimas aplicaciones"), entonces no vuelvo a la última actividad, sino a El principal. La otra actividad es destruida.

Alguna idea de cómo puedo implementar el comportamiento de SingleTask sin solo poder volver a una actividad?

+0

Me alegro de que haya encontrado una solución para su problema. Para futuros lectores, creo que la causa raíz aquí no estaba relacionada con lo que dice la respuesta aceptada, sino que en realidad se explica el "error" aquí: http://stackoverflow.com/questions/2417468/android-bug-in-launchmode-singletask -activity-stack-not-preserved – eselk

Respuesta

3

Si sus otras actividades se declaran normalmente con valores por defecto de actividad en Android, a continuación, volver a su aplicación se debe tomar a la misma actividad donde lo dejó (usando el botón de inicio de hardware)

Sin embargo, recuerde que el sistema Android mata aplicaciones cuando requiere recursos del sistema. Entonces, es posible que tu aplicación haya sido eliminada cuando fuiste a la otra aplicación. Luego, cuando regrese a su aplicación, se reiniciará la actividad del iniciador predeterminado, que es su actividad de menú.

Para volver a la actividad principal de cualquier actividad, hacer esto:

public static void goHome(Context context) { 
     final Intent intent = new Intent(context, HomeActivity.class); //give name of your main activity class here 
     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     context.startActivity(intent); 
    } 

que despejará la pila actividad y que todo vuelva a su actividad principal. Como declaró singleTop, traerá la actividad principal existente al primer plano. La bandera Intent.FLAG_ACTIVITY_CLEAR_TOP eliminará todas las actividades en la pila en la parte superior de la actividad principal. (Estoy asumiendo que estás dentro de la misma aplicación).

Ahora, todas sus otras actividades sólo tiene que incluir un botón que tiene el oyente clic invoca el método goHome();

De su actividad, si se pulsa el botón de hardware de vuelta, debe salir de la aplicación.

+1

Realmente me gustaría tener un comportamiento normal. Sin embargo, si declaro que mi actividad principal es una única tarea, las otras actividades se destruirán si presiono el botón de inicio. Lo que me gustaría lograr es a) un enlace rápido a la actividad principal a través del menú, sin volver a crear la aplicación principal yb) "cerrar" toda la aplicación presionando el botón Atrás en la actividad principal. (el cierre significa el mismo efecto que el botón de inicio). Sin embargo, b) es bueno tenerlo, así que principalmente me gustaría lograr a). :-) – jellyfish

+0

Ahora entiendo lo que quieres decir. Ver mi respuesta editada arriba. Siempre deje en claro si está hablando del botón de retroceso de hardware o uno de software. – codinguser

+0

¡Muchas gracias! Eso era exactamente lo que estaba buscando. También recordaré tus consejos en el futuro. :-) – jellyfish

0

¿Por qué no llamar a finish() en las actividades que fueron creadas por la actividad principal? De esta manera puede volver a la actividad principal, sin crear una nueva ...

+0

suena bien, pero a veces tengo más de una actividad entre mi actividad real y mi actividad principal. ¿Hay alguna manera de cerrar todo en el medio? – jellyfish

+0

Puede haber una solución mejor, pero puede cerrar las actividades llamando a finish() cuando se llame a ActionResult.Debería establecer un indicador de resultados en la actividad superior, como "CERRAR", y las actividades subyacentes manejarían el cierre. Sería así, A crea B que crea C. Ahora las llamadas C terminan con el resultado "CERRAR", B obtiene el código de resultado en ActividadResultado y se cierra llamando a terminar .... –

+0

Ya veo, gracias. Voy a intentar esto. :-) – jellyfish

0

Creo que debe guardar el estado de su actividad antes de comenzar otra actividad, y luego reanudar su actividad cada vez que regrese a la última actividad. ver ciclo de actividad de la vida desde Android http://developer.android.com/guide/topics/fundamentals/activities.html

+0

Con mucho gusto haré esto, pero no sé cómo reanudar mi actividad principal sin volver a recorrer toda la pila de actividades. – jellyfish