Reinicio de la aplicación – Punto de entrada de la actividad

Tengo una aplicación donde el punto de entrada es decir una actividad de "inicio de sesión / salpicadura" , donde necesito pre-cargar datos frescos del servidor. Esta SplashActivity se declara como:

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

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

Espero que después de que mi Application sea ​​detenida por el sistema operativo o por el usuario (con Force Stop), y luego más tarde sea reiniciado por el usuario, el punto de entrada de mi aplicación será SplashActivity nuevo, pero el sistema omite el SplashActivity Y muestra MainActivity .

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

En realidad, hay varios problemas que se abordan en esta pregunta y algunas de las respuestas a ella:


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

Android considera que cada actividad es una entidad autónoma independiente. Android recuerda el estado de las actividades en la pila de tareas y no tiene ningún problema matando su proceso (que contiene todas sus actividades) cuando quiera, porque "sabe" que siempre puede reconstruir sus actividades cuando sea necesario. Este concepto, por supuesto, se descompone cuando tiene una aplicación compleja en la que tiene dependencias entre las actividades y / o tiene datos globales que almacena en una clase de Application (o similar).

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

Por ejemplo, si su pila de tareas tiene este aspecto:

 StartActivity -> ActivityB -> ActivityC -> ActivityD 

Y su tarea pasa al fondo y Android mata el proceso, cuando el usuario vuelve a la tarea sólo ActivityD volverá a crear. Una vez que ActivityD termine, Android recreará ActivityC . Una vez que ActivityC termine, Android recreará ActivityB , etc. En resumen, la pila completa no se recreará cuando el usuario reanude la tarea.

No hay ninguna combinación de configuraciones de manifiesto o indicadores de intención que le proporcionarán el comportamiento que desea. Sería bueno que Android ofreciera algo así, pero en este momento no.


Puede determinar si su proceso se ha reiniciado utilizando una variable booleana estática (clase) en su clase derivada de la aplicación (o en cualquier otra clase). Esta variable siempre tendrá el valor false cuando se reinicie el proceso y, a continuación, puede comprobar el estado de la variable desde cualquier lugar y reinicializar (recargar los datos) si es necesario. A continuación, establezca la variable en true . Permanecerá true hasta que el proceso sea matado y recreado, incluso si todas sus actividades terminan. De esta manera sólo puede inicializarse cuando sea necesario.

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

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

Esto finalizará todas las actividades de la tarea y reiniciará SplashScreen en la raíz de la tarea.


A continuación, si desea evitar tener que descargar datos cada vez que el usuario regrese a la aplicación (cuando estaba en segundo plano y posteriormente fue eliminado por AndroidOS), debería guardar los datos que descargó en el área de caché privada y utilizarlos Cuando se reinicie la aplicación. Esto evita tener que descargar los datos repetidamente si el proceso se cancela y se reinicia.


Otra forma de hacer frente a esto sería cargar sus datos en un servicio. Si tiene un Service en ejecución en su proceso, es menos probable que Android muera su proceso. Sólo tiene que asegurarse de que cierra su Service cuando el usuario ha terminado con su aplicación.


Me doy cuenta de que esta respuesta es larga. Espero que pueda sacar algo de ella.

Se puede hacer así:

1. SplashActivity comenzará sin duda cada vez.

2. Descargue los datos y guarde el cheque (booleano) indicando que la carga se ha hecho previamente. Puede usar SharedPreferences .

3. Compruebe la condición la próxima vez e inicie su MainActivity inmediatamente.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.