¿El borrado automático de tareas ocurre en versiones modernas de Android?

De acuerdo con la documentación de Android, el sistema borrará una tarea (finalizar todas las Actividades por encima de la que lanzó la tarea) que considere haber sido abandonada por el usuario:

Https://developer.android.com/guide/components/tasks-and-back-stack.html#Clearing

Si el usuario deja una tarea durante mucho tiempo, el sistema borra la tarea de todas las actividades excepto la actividad raíz. Cuando el usuario vuelve a la tarea de nuevo, sólo se restaura la actividad raíz. El sistema se comporta de esta manera, porque, después de una cantidad de tiempo prolongada, los usuarios probablemente han abandonado lo que estaban haciendo antes y están regresando a la tarea para comenzar algo nuevo.

Https://developer.android.com/guide/topics/manifest/activity-element.html#always

Normalmente, el sistema borra una tarea (elimina todas las actividades de la pila por encima de la actividad raíz) en determinadas situaciones cuando el usuario vuelve a seleccionar esa tarea desde la pantalla de inicio. Normalmente, esto se hace si el usuario no ha visitado la tarea durante un tiempo determinado, como 30 minutos.

Este comportamiento se puede reproducir fácilmente en dispositivos que ejecutan Gingerbread y anteriores. Inicie una aplicación y cree un historial, luego pulse el botón de inicio y espere media hora. Vuelva a iniciar la aplicación desde la pantalla de inicio y el estado se ha borrado como si estuviera iniciando una nueva tarea. Perfecto.

Sin embargo, en dispositivos que ejecutan ICS y superiores, no puedo reproducir este comportamiento en absoluto, incluso después de que una tarea haya estado inactiva después de muchas horas o días. Cuando una aplicación se relanza desde la pantalla de inicio, la tarea siempre está en el estado en el que la dejé.

Suponiendo que la documentación es correcta, ¿en qué condiciones las versiones modernas de Android (API 14+) eliminarán automáticamente una tarea?

Si el comportamiento ha cambiado y la documentación está desactualizada, ¿cuál es el propósito del atributo alwaysRetainTaskState para <activity/> ? ¿Ha cambiado el valor predeterminado a "true" o es este atributo ahora obsoleto?

Nota: No estoy hablando aquí de la gestión del ciclo de vida del proceso de Android, que dependerá de los recursos del dispositivo. Matar un proceso debe ser transparente para el usuario de todos modos y no afecta al estado de tarea.

Gran pregunta, después de un poco de fuente de buceo la respuesta sin duda me sorprendió!

Un vistazo rápido a las fuentes de Android parece proporcionar la respuesta. Empecemos por mirar hacia atrás en Android 2.2 en ActivityManagerService.java . Observe alrededor de la línea 186 una constante definida como ACTIVITY_INACTIVE_RESET_TIME que pasa a estar establecida en 30 minutos.

 // How long until we reset a task when the user returns to it. Currently // 30 minutes. static final long ACTIVITY_INACTIVE_RESET_TIME = 1000*60*30; 

Busque un poco más para el método resetTaskIfNeededLocked() alrededor de la línea 7021 y verá este valor marcado para determinar si la tarea debe restablecerse antes de iniciarse.

Avance rápido a las fuentes de Android 4.3 y el código se ha movido a ActivityStack.java que se llama desde ActivityManagerService, pero la estructura básica es la misma. Esta vez, la constante se define alrededor de la línea 125:

 // How long until we reset a task when the user returns to it. Currently // disabled. static final long ACTIVITY_INACTIVE_RESET_TIME = 0; 

El mismo método resetTaskIfNeededLocked() se encuentra alrededor de la línea 1973 y se puede ver que ahora comprueba si el valor es mayor que cero antes de aplicar la misma comprobación de tiempo de espera para borrar el estado de tarea. Tenga en cuenta, sin embargo, que este método sigue comprobando FLAG_ALWAYS_RETAIN_TASK_STATE , por lo que este indicador todavía se puede utilizar para proteger un estado claro, pero parece que con el control externo desactivado este código nunca se ejecutará.

En general, esto parece una evidencia bastante convincente de que la función se ha inhabilitado efectivamente en AOSP para versiones posteriores de Android. No veo un medio externo (a través de propiedades del sistema, etc.) para que este valor se reactive por dispositivo a menos que el fabricante reconstruya el código con un valor agregado aquí … pero eso es poco común. La mayoría de los ODM se adhieren a las propiedades de configuración en XML o propiedades del sistema que pueden controlar a través de una superposición.

Así que aunque técnicamente la característica no ha sido "eliminada", me parece que la documentación ya no es correcta en términos de auto-disparo después de un retraso.

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