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

147

La reciente lista de aplicaciones en Ice Cream Sandwich agregó la capacidad de eliminar aplicaciones de la lista, descartándolas permanentemente (y que yo sepa, esta es una función vainilla, no una 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.

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

Al darme cuenta ahora de que la 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 "relanzarse" después de la detención forzada (lo cual tiene sentido) aunque la miniatura en la lista de aplicaciones recientes no reflejó esto (en caché, supongo).

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

eldarerathis
fuente

Respuestas:

68

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

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

Específicamente para la aplicación Música, creo que inicia un servicio, por lo que si bien 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.

Austin Mills
fuente
1
Gracias, ese enlace tiene mucha buena discusión. También puede que tengas razón en cuanto a: Música, que puede haber sido una mala prueba. Probaré otra aplicación, solo por diversión.
eldarerathis
2
Continuaré y aceptaré esto, ya que la discusión de reddit me ayudó a encontrar algunos mejores términos de búsqueda, y parece que fue corroborado por algunas publicaciones de Dianne Hackborn que noté en mi respuesta . ¡Gracias!
eldarerathis
1
¡Perfecto, gracias! Para mí, esta publicación me ayudó: reddit.com/r/Android/comments/mpevh/…
Boris Strandjev
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 el widget nuevamente para iniciar la música.
Lucky
78

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 fuera de la lista reciente. El primero es un comentario en una de sus publicaciones de Google+ :

[Lo] que sucede específicamente cuando desliza una tarea reciente es: (1) elimina cualquier fondo o proceso vacío de la aplicación (consulte http://developer.android.com/guide/topics/fundamentals/processes-and- threads.html # Ciclo de vida para lo que esto significa), y (2) usa la nueva http://developer.android.com/reference/android/app/Service.html#onTaskRemoved(android.content.Intent) API para informar a cualquier servicios de la aplicación sobre la eliminación de la tarea para que pueda hacer lo que considere apropiado.

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

En realidad, eliminar una entrada en 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 deciden si quieren que esto signifique que deberían detenerse. Esto es para que, por ejemplo, eliminar la tarea reciente de una aplicación de correo electrónico no haga que deje de verificar el correo electrónico.

Si realmente desea detener por completo una aplicación, puede presionar prolongadamente las tareas recientes para acceder a la información de la aplicación y presionar detener la fuerza allí. Para detener es una eliminación completa de la aplicación: se eliminan todos los procesos, se detienen todos los servicios, se eliminan todas las notificaciones, se eliminan todas las alarmas, etc. La aplicación no puede iniciarse nuevamente hasta que se solicite explícitamente.

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

eldarerathis
fuente
Eso es ciertamente un comportamiento no obvio, ¡muy interesante!
Matthew leyó el
"elimina los procesos en segundo plano que existan para el proceso. No hará que los servicios se detengan directamente". ¿Sigue siendo cierto? Ayer hice una prueba. Ayer, eliminé una aplicación con un servicio en segundo plano en el proceso principal. Las aplicaciones => ejecutando la IU mostraron 0 procesos y 0 servicios. Más tarde, eliminé la misma aplicación con un proceso que se ejecuta en un proceso específico de la aplicación por separado. La aplicación => ejecutando la interfaz de usuario dijo que tenía 0 procesos y 1 servicio. Eso fue en un Moto X (2014) con Android 4.4.4.
Steven Wexler
@StevenWexler: Podría ser que el servicio terminara por sí solo en el primer caso pero no en el segundo, o podría ser que en el segundo escenario el proceso principal determinó (por alguna razón) que no quería detener el servicio. Difícil de saber con certeza.
eldarerathis
el servicio iniciado se inicia automáticamente nuevamente después de salir de la lista reciente, se llama a onCreate nuevamente. pero en algunas aplicaciones onCreate llamó antes a onTaskRemoved y en algunas se llamó después a onTaskRemoved. ¿Por qué es este comportamiento entonces?
umesh
21

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

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

onik
fuente
10

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. Puedes probar también. Aquí está mi aplicación de prueba: https://bitbucket.org/Leandros99/lifecycletest (descarga disponible, también. Para aquellos que no pueden construir).
En todos los métodos de ciclo de vida de la actividad ( http://developer.android.com/reference/android/app /Activity.html#ActivityLifecycle ) imprime la aplicación en un registro. Puede verlo con adb logcat (instale Android SDK, cd en herramientas de plataforma en cmd / shell y escriba adb logcat. Ahora verá que cada vez que hace algo como presionar el botón de inicio o de inicio, la aplicación imprime el método del ciclo de vida mencionado anteriormente. )

Su pregunta: si deslizo una aplicación desde el 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.

Leandros
fuente
3

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 cierran automáticamente como resultado del cierre de la aplicación.

usuario3067986
fuente
1
Aunque está escrito en el lenguaje cotidiano, esta es en realidad una respuesta bastante precisa: captura el hecho de que el proceso se elimina, faltan muchas de las otras respuestas (las que erróneamente lo compararon 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 logra una limpieza de la memoria, eso sucedería automáticamente si fuera necesario.
Chris Stratton