2012-06-28 16 views
12

Tengo una aplicación donde el punto de entrada es "inicio de sesión/salpicadura"Activity, donde necesito cargar datos nuevos del servidor. Este SplashActivity se declara como:Reinicio de la aplicación - Actividad Punto de entrada

<action android:name="android.intent.action.MAIN" /> 
<category android:name="android.intent.category.LAUNCHER" /> 

en mi AndroidManifest.xml, después de cargar los datos, guardo algunos datos en mi clase personalizada Application y procedo a mi MainActivity.

Estoy esperando que después de mi Application es detenido por el sistema operativo o por el usuario (mediante la fuerza de parada), y luego se reinicia por el usuario, el punto de entrada de mi solicitud para ser SplashActivity nuevo PERO el sistema se salta el SplashActivity y muestra el MainActivity.

PREGUNTA: este es el comportamiento esperado? Si se detiene todo el proceso, ¿no debería iniciarse mi aplicación con SplashActivity? ¿Se puede lograr esto?

+0

puede configurar android: noHistory = "true" en la etiqueta de actividad en el archivo de manifiesto – rajpara

+0

AFAIK, su pregunta es incorrecta, la aplicación force stopped siempre comenzará desde su actividad de iniciador principal. – MKJParekh

Respuesta

24

En realidad, hay varios problemas que se abordan en esta cuestión y algunas de las respuestas a la misma:


Para responder a su pregunta original, "Sí, este es el comportamiento esperado".

Android considera que cada actividad es una entidad separada e independiente. Android recuerda el estado de las actividades en la pila de tareas y no tiene ningún problema en matar tu proceso (que contiene todas tus actividades) siempre que lo desee, porque "sabe" que siempre puede reconstruir tus actividades siempre que lo necesite. Este concepto, por supuesto, se rompe cuando tienes una aplicación compleja donde tienes dependencias entre las actividades y/o tienes datos globales que almacenas en una clase Application (o similar lugar estático/único).

Cuando Android mata a su proceso que recuerda la actividad más alta en la tarea y cuando el usuario vuelve a la tarea que se recrea el proceso y luego recrea única la actividad más alta en la tarea. En su caso, MainActivity.

A modo de ejemplo, si su pila tarea se ve así:

StartActivity -> ActivityB -> ActivityC -> ActivityD 

y su tarea pasa a un segundo plano y Android mata el proceso, cuando se volverá a crear el usuario vuelve a la tarea sólo ActivityD. Una vez que finalice ActivityD, Android recreará ActivityC. Una vez que finalice ActivityC, Android recreará ActivityB, etc.En resumen, la pila completa es no recreado cuando el usuario reanuda la tarea.

No hay una combinación de configuraciones de manifiesto o indicadores de intenciones que le proporcionen el comportamiento que desea. Sería bueno si Android ofreciera algo así, pero por el momento no es así.


Se puede determinar si el proceso se ha reiniciado mediante el uso de una estática (clase) variable booleana en su clase de aplicación derivado de (o de cualquier otra clase). Esta variable siempre tendrá el valor false cuando se reinicie el proceso y luego puede verificar el estado de la variable desde cualquier lugar y reinicializar (volver a cargar sus datos) si es necesario. Luego establece la variable en true. Seguirá siendo true hasta que se mate y vuelva a crear el proceso, incluso si terminan todas sus actividades. De esta forma, puede inicializar solo cuando sea necesario.

También puede utilizar esto como un indicador para reiniciar su aplicación desde el SplashScreen. Así, en todas sus actividades, en onCreate(), se puede comprobar el estado de esta variable booleana y si la aplicación se ha reiniciado puede simplemente redirigir a la SplashScreen así:

Intent intent = new Intent(this, SplashScreen.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent); 

Esto va a terminar todas las actividades en el tarea y reinicie SplashScreen en la raíz de la tarea.


A continuación, si desea evitar tener que descargar los datos cada vez que el usuario vuelve a la aplicación (cuando estaba en el fondo y posteriormente asesinados por el AndroidOS), se deben almacenar los datos que se descarga en el área de caché privada y usar eso cuando la aplicación se reinicia. Esto evita tener que descargar los datos repetidamente si su proceso se cancela y se reinicia.


Otra forma de resolver esto sería cargar sus datos en un Servicio. Si tiene un Service ejecutándose en su proceso, es menos probable que Android mate su proceso. Solo debe asegurarse de cerrar su Service cuando el usuario haya terminado con su aplicación.


Me doy cuenta de que esta respuesta es larga. Espero que puedas sacar algo de eso.

+0

sí. Gracias por su tiempo en esto. Estaba realmente convencido de que una vez que el SO detenga el proceso, la aplicación se reiniciará desde el punto de entrada ... porque esto es lo que sucede cuando DETENIMOS ... a través de DDMS o Configuración-> Aplicaciones. –

+2

no, eso no es verdad. Lo que sucede cuando lo detiene es esto: el depurador envía una señal al proceso para matarlo, por lo que el proceso muere. Android ve esto y dice "Oh, hay una actividad mal conducida en esa aplicación que causó su muerte. Así que voy a reiniciar ese proceso para el usuario, pero antes de hacerlo, voy a eliminar esa actividad de mal comportamiento. de la pila ". Entonces, lo que ves es el proceso reiniciado con tu actividad raíz. –

+0

gracias mil millones a los dos ... He pasado unos días en un problema similar http: //stackoverflow.com/questions/11190469/android-app-crashes-suddenly-while-running ... Pregunta y su respuesta realmente ayudó mucho ... – aProgrammer

0

Se puede hacer así:

1.SplashActivity comenzará sin duda cada vez.

2. Descargue los datos y guarde el cheque (booleano) que indica que la carga se realizó previamente. Puede usar SharedPreferences.

3. Compruebe la condición la próxima vez y comience su MainActivity inmediatamente.

+0

sí, pero una vez que configuro mi "verificación" como verdadera, ¿cuándo lo configuro como "falso"? –

+0

con respecto a "1", ¿cómo se puede argumentar que Splash comenzará todo el tiempo? alguien aquí está teniendo el mismo problema, después de reiniciar la aplicación http://stackoverflow.com/questions/11190469/android-app-crashes-suddenly-while-running/11242705#11242705 –

+0

¿necesita descargar los datos cada vez que su la aplicación comienza? –

Cuestiones relacionadas