¿Qué sucede realmente cuando deslizas una aplicación de la lista de aplicaciones recientes?

La lista de aplicaciones recientes en Ice Cream Sandwich agregó la capacidad de deslizar aplicaciones fuera de la lista, descartándolas así de forma permanente (y hasta donde yo sé, esta es una función estándar, no una de CM/ROM personalizada). La documentación y los aspectos destacados de la plataforma no parecen cubrir el funcionamiento oculto de esta funcionalidad, pero tengo curiosidad por saber qué está haciendo realmente el sistema.

Para aumentar aún más mi curiosidad, decidí hacer una prueba rápida: inicié Música en una instalación de CM9 y luego me retiré. Luego revisé la lista de aplicaciones recientes y vi que efectivamente estaba allí (y en el estado adecuado, según la miniatura). Luego entré Settings->Applicationsy forcé la detención de la aplicación Música, pero aún figuraba en la lista reciente, lo que me hizo creer que no está conectada a procesos persistentes en segundo plano.

Al darme cuenta ahora de que Música puede haber sido una mala elección, también probé con la aplicación USA Today. Esto exhibió básicamente el mismo comportamiento, y parecía que se vio obligado a "reiniciar" después de la detención forzada (lo cual tiene sentido), aunque la miniatura en la lista de aplicaciones recientes no reflejaba esto (en caché, ¿supongo?).

Entonces, ¿qué sucede realmente en el nivel del sistema operativo cuando desliza una aplicación de la lista reciente? ¿Simplemente borra los datos de la aplicación de la memoria RAM y los recolecta como basura, destruyendo su estado guardado?

Respuestas (5)

Deslizar aplicaciones fuera de la lista de aplicaciones recientes es simple, y sí, no está bien documentado. Este ha sido el tema de una buena cantidad de discusión en varios foros de Android... el consenso parece estar mejor descrito aquí en algunos comentarios : que el comportamiento es similar pero no exactamente igual que cerrar una aplicación, en general ( para las aplicaciones que no definen el manejo explícito del botón de retroceso) es lo mismo que retroceder suficientes veces desde dentro de una aplicación para salir de ella.

El enlace tiene más detalles sobre los detalles, pero en general puede pensar que es como salir de la aplicación.

Específicamente para la aplicación Música, creo que inicia un servicio, por lo que aunque la tarea en sí (la aplicación Música/IU) puede estar cerrada, el servicio continúa ejecutándose en segundo plano para que su música no se detenga repentinamente solo porque la tarea se borró por razones de administración de memoria. Eso puede haber afectado lo que viste.

Gracias, ese enlace tiene un montón de buena discusión. También podría tener razón en cuanto a: Música, esa puede haber sido una mala prueba. Probaré con otra aplicación, solo por diversión.
Seguiré adelante y aceptaré esto, ya que la discusión de reddit me ayudó a encontrar mejores términos de búsqueda y pareció corroborarse con algunas publicaciones de Dianne Hackborn que anoté en mi respuesta . ¡Gracias!
¡Perfecto, gracias! Para mí, esta publicación me ayudó: reddit.com/r/Android/comments/mpevh/…
Los reproductores de música de terceros, como Rocket Player, detienen la música cuando desliza la aplicación desde la lista Recientes, incluso si el servicio se ejecuta en segundo plano y necesita abrir la aplicación o reproducir en el widget nuevamente para iniciar la música.

Parece que encontré los términos de búsqueda mágicos que llevaron a algunas explicaciones de los empleados de Google. Específicamente, encontré un par de lugares diferentes donde Dianne Hackborn explica qué sucede cuando deslizas algo de la lista reciente. El primero es un comentario en una de sus publicaciones de Google+ :

[L]o que sucede específicamente cuando deslizas una tarea reciente es: (1) elimina cualquier fondo o procesos vacíos de la aplicación (ver http://developer.android.com/guide/topics/fundamentals/processes-and- threads.html#Lifecycle para lo que esto significa), y (2) utiliza la nueva http://developer.android.com/reference/android/app/Service.html#onTaskRemoved(android.content.Intent) API para indicar cualquier servicios de la aplicación sobre la tarea que se está eliminando para que pueda hacer lo que considere apropiado.

Ella también señala en un comentario de blog :

En realidad, eliminar una entrada en las tareas recientes eliminará cualquier proceso en segundo plano que exista para el proceso. No hará que los servicios se detengan directamente, sin embargo, hay una API para que descubran que la tarea se eliminó y decidan si quieren que esto signifique que deben detenerse. Esto es para que eliminar, digamos, la tarea reciente de una aplicación de correo electrónico no haga que deje de buscar correo electrónico.

Si realmente desea detener una aplicación por completo, puede presionar prolongadamente las tareas recientes para ir a la información de la aplicación y presionar forzar la detención allí. Porque detener es eliminar por completo la aplicación: todos los procesos se eliminan, todos los servicios se detienen, todas las notificaciones se eliminan, todas las alarmas se eliminan, etc. No se permite que la aplicación vuelva a iniciarse hasta que se solicite explícitamente.

Por lo tanto, parece que el resumen es que deslizar una aplicación fuera de la lista eliminará primero todos los procesos en segundo plano para la aplicación y luego se usará onTaskRemovedpara notificar a la aplicación que se eliminó la tarea en segundo plano. En ese punto, parece que depende de la aplicación decidir qué sucede, así que supongo que técnicamente no hay una regla estricta sobre lo que le sucede a la aplicación más allá de ese punto.

Eso es ciertamente un comportamiento no obvio, ¡muy interesante!
"matar cualquier proceso en segundo plano que exista para el proceso. No hará que los servicios se detengan directamente". ¿Sigue siendo cierto? Hice una prueba ayer. Ayer, eliminé una aplicación con un servicio en segundo plano en el proceso principal. Las aplicaciones => la interfaz de usuario en ejecución mostró 0 procesos y 0 servicios. Más tarde, eliminé la misma aplicación con un proceso que se ejecutaba en un proceso específico de aplicación separado. Las aplicaciones => la interfaz de usuario en ejecución decía que tenía 0 procesos y 1 servicio. Eso fue en un Moto X (2014) con Android 4.4.4.
@StevenWexler: Podría ser que el servicio finalizara por sí solo en el primer caso pero no en el segundo, o podría ser que en el segundo escenario el proceso principal determinara (por alguna razón) que no quería detener el servicio. Es difícil saberlo con certeza.
El servicio iniciado se inicia automáticamente nuevamente después de deslizar el dedo de la lista reciente, se llama onCreate nuevamente. pero en algunas aplicaciones, onCreate se llama antes de onTaskRemoved y en algunas se llama después de onTaskRemoved. ¿Por qué este comportamiento es entonces?

Hay algo de información en el código fuente en las clases com.android.internal.policy.impl.RecentApplicationsBackground y com.android.internal.policy.impl.RecentApplicationsDialog .

Si los leo correctamente, hay controladores específicos para seleccionar las aplicaciones, pero nada especial para deslizarlas, excepto onDetachedFromWindow(), que llama, lo com.android.View.onDetachedFromWindow()que básicamente oculta el elemento y borra sus datos. Esto insinuaría el hecho de que no sucede nada especial al deslizar la aplicación, lo que corresponde con la respuesta de Austin Mills, porque dado que la lista no muestra la aplicación activa, las onPause()llamadas al sistema y otras que se realizan al "salir" de una aplicación tienen ya pasó.

Creo que hará lo mismo que el botón Atrás. Excepto un pequeño cambio. Será finish()toda la actividad / fragmentos en la aplicación.

Acabo de hacer una pequeña prueba con una pequeña aplicación de autoconstrucción. También puedes probar. Aquí está mi aplicación de prueba: https://bitbucket.org/Leandros99/lifecycletest (descarga disponible también. Para aquellos que no pueden construir).
En cada método de ciclo de vida de actividad ( http://developer.android.com/reference/android/app /Activity.html#ActivityLifecycle ) imprima un registro de la aplicación. Puede verlo con adb logcat (instale Android SDK, cd a herramientas de plataforma en cmd / shell y escriba adb logcat. Ahora verá, cada vez que hace algo como presionar el botón Atrás o Inicio, la aplicación imprime el método de ciclo de vida, mencionado anteriormente. )

Tu pregunta: si deslizo una aplicación del cajón de aplicaciones recientes, onDestroyse llamará al método. Hace casi lo mismo que el botón Atrás.
Espero haber ayudado un poco. Si hay preguntas, solo pregunte.

Cierra la aplicación y sus datos que se almacenan en la RAM. Por lo tanto, le brinda más espacio de RAM para que pueda ejecutar otras aplicaciones. Sin embargo, los servicios en segundo plano NO se fuerzan a cerrar automáticamente como resultado de cerrar la aplicación en uso.

Aunque está escrito en un lenguaje cotidiano, esta es en realidad una respuesta bastante precisa: captura el hecho de que el proceso se elimina, algo que falta en muchas de las otras respuestas (aquellas que lo comparan erróneamente con el botón Atrás). Sin embargo, lo que falta aquí es darse cuenta de que Android eliminará los procesos cuando sea necesario para obtener memoria de todos modos, por lo que, si bien realiza una limpieza de la memoria, eso sucederá automáticamente cuando sea necesario.