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.
puede configurar android: noHistory = "true" en la etiqueta de actividad en el archivo de manifiesto – rajpara
AFAIK, su pregunta es incorrecta, la aplicación force stopped siempre comenzará desde su actividad de iniciador principal. – MKJParekh