153 votos

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

La lista de aplicaciones recientes en Ice Cream Sandwich agregó la capacidad de deslizar las aplicaciones fuera de la lista, descartándolas permanentemente (y hasta donde sé, esta es una función de serie, no una de CM/custom ROM). La documentación y los aspectos destacados de la plataforma no parecen cubrir el funcionamiento interno de esta funcionalidad, pero tengo curiosidad por saber qué está haciendo el sistema en realidad.

Añadiendo más a mi curiosidad, decidí hacer una prueba rápida: inicié Music en una instalación de CM9, luego salí de ella. Luego revisé la lista de aplicaciones recientes y vi que efectivamente estaba allí (y en el estado adecuado, según la miniatura). Luego fui a Configuración->Aplicaciones y detuve forzosamente la aplicación de Música, pero aún estaba en la lista reciente, lo que me llevó a creer que no está conectada a procesos persistentes en segundo plano.

Dándome cuenta ahora de que Music pudo haber sido una elección pobre, también probé con la aplicación de USA Today. Esta exhibió básicamente el mismo comportamiento, y parecía estar obligada a "volver a iniciar" después de la detención forzosa (lo cual tiene sentido) aunque la miniatura en la lista de aplicaciones recientes no lo reflejaba (¿en caché, supongo?).

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

81voto

David Negron Puntos 971

Al parecer he encontrado 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 se desliza algo fuera de la lista reciente. La primera es un comentario en una de sus publicaciones en Google+:

[W]lo que sucede específicamente cuando se desliza una tarea reciente es que: (1) mata cualquier proceso en segundo plano o vacío de la aplicación (ver https://developer.android.com/guide/topics/fundamentals/processes-and-threads.html#Lifecycle para lo que esto significa), y (2) utiliza el nuevo https://developer.android.com/reference/android/app/Service.html#onTaskRemoved(android.content.Intent) API para informar a los servicios de la aplicación sobre la tarea que está siendo eliminada para que pueda hacer lo que considere apropiado.

Ella también nota en un comentario en un blog:

En realidad, eliminar una entrada en las tareas recientes eliminará cualquier proceso en segundo plano que exista para el proceso. No detendrá directamente los servicios, sin embargo hay una API para que descubran si la tarea fue eliminada para decidir si quieren que esto signifique que deben detenerse. Esto es para que al eliminar, por ejemplo, la tarea reciente de una aplicación de correo electrónico no causará que deje de verificar el correo electrónico.

Si realmente quieres detener por completo una aplicación, puedes mantener presionada la tarea reciente para ir a la información de la aplicación y presionar detener forzosamente allí. Detener es una eliminación completa de la aplicación -- todos los procesos se detienen, todos los servicios detenidos, todas las notificaciones eliminadas, todas las alarmas eliminadas, etc. La aplicación no puede lanzarse nuevamente hasta que se solicite explícitamente.

Entonces, parece que el resumen es que al deslizar una aplicación fuera de la lista primero matará todos los procesos en segundo plano de la aplicación, luego usará onTaskRemoved para notificar a la aplicación que la tarea en segundo plano fue eliminada. En ese punto, parece que depende de la aplicación decidir qué sucede, así que supongo que técnicamente no hay una regla definitiva sobre lo que le sucede a la aplicación más allá de ese punto.

0 votos

Eso ciertamente es un comportamiento no obvio, ¡muy interesante!

0 votos

"Mata cualquier proceso en segundo plano que exista para el proceso. No detendrá directamente los servicios". ¿Esto sigue siendo cierto? Ayer hice una prueba. Ayer, eliminé una aplicación con un servicio en segundo plano en el proceso principal. La interfaz de usuario para las aplicaciones en ejecución mostró 0 procesos y 0 servicios. Más tarde eliminé la misma aplicación con un proceso en ejecución en un proceso específico de aplicación separado. La interfaz de usuario para las aplicaciones en ejecución mostró 0 procesos y 1 servicio. Esto fue en un Moto X(2014) con Android 4.4.4.

0 votos

@StevenWexler: Podría ser que el servicio se haya detenido 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 saber con certeza.

70voto

t3rse Puntos 5983

Eliminar aplicaciones de la lista de aplicaciones recientes es algo común, y sí, no está bien documentado. Este tema ha sido objeto de una cantidad decente de discusión en varios foros de Android... el consenso parece ser mejor descrito aquí en algunos comentarios: que el comportamiento es similar pero no exactamente igual que cerrar una aplicación - en general (para aplicaciones que no definen un manejo explícito del botón de regreso) es lo mismo que presionar suficientes veces atrás desde dentro de una aplicación para salir de ella.

El enlace tiene más detalles sobre los específicos, pero en general puedes pensar en esto como salir de la aplicación.

En cuanto a la aplicación de Música, creo que inicia un servicio, por lo que mientras la tarea en sí (la aplicación de Música/UI) puede cerrarse, el servicio continúa funcionando en segundo plano para que tu música no se detenga repentinamente solo porque la tarea se despejó por razones de gestión de memoria. Eso puede haber afectado lo que viste.

1 votos

Gracias, ese enlace tiene muchas buenas discusiones. Es posible que tengas razón en cuanto a la música, podría haber sido una mala prueba. Intentaré otra aplicación, solo por diversión.

2 votos

Voy a seguir adelante y aceptar esto, ya que la discusión en Reddit me ayudó a encontrar algunos términos de búsqueda mejores, y parecía estar corroborada por algunas publicaciones de Dianne Hackborn que mencioné en mi respuesta. ¡Gracias!

23voto

Chris Roberts Puntos 7543

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

Si lo leo correctamente, hay manejadores específicos para seleccionar las aplicaciones pero nada especial para deslizarlas excepto por onDetachedFromWindow(), que llama a com.android.View.onDetachedFromWindow() que básicamente oculta el elemento y borra sus datos. Esto indicaría que no sucede nada especial al deslizar la aplicación, lo cual corresponde con la respuesta de Austin Mills, ya que como la lista no muestra la aplicación activa, el onPause() y otras llamadas del sistema que se hacen al "salir" de una aplicación ya han ocurrido.

10voto

Leandros Puntos 610

Creo que hará lo mismo que hace el botón de retroceso. Excepto un pequeño cambio. finish() todas las actividades/fragmentos de la aplicación.

Acabo de hacer unas pruebas con una pequeña aplicación autoconstruida. Tú también puedes probar. Aquí está mi aplicación de prueba: https://bitbucket.org/Leandros99/lifecycletest (también disponible para descarga. Para aquellos que no pueden compilar.)
En cada método del ciclo de vida de la Actividad (https://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle) imprime un registro de la aplicación. Puedes verlo con adb logcat (instalar Android SDK, cd a platform-tools en cmd/shell y escribir adb logcat. Ahora verás que cada vez que haces algo como presionar el botón de retroceso o de inicio, la aplicación imprime el método del ciclo de vida mencionado anteriormente).

Tu pregunta: Si cierro una aplicación desde el cajón de aplicaciones recientes, se llamará al método onDestroy. Hace casi lo mismo que el botón de retroceso.
Espero que haya ayudado un poco. Si hay preguntas, solo pregunta.

4voto

user3067986 Puntos 11

Se cierra la aplicación y los datos que se encuentran almacenados en la RAM. Por lo tanto, te brinda más espacio en la RAM para que puedas ejecutar otras aplicaciones. Sin embargo, los servicios en segundo plano NO se cierran automáticamente como resultado de cerrar la aplicación en uso.

1 votos

Aunque está escrito en un lenguaje cotidiano, en realidad es una respuesta bastante precisa: captura el hecho de que el proceso se desecha, algo que muchas de las otras respuestas (aquellas que lo comparan erróneamente con el botón de retroceso) no están considerando. Sin embargo, lo que falta aquí es darse cuenta de que Android desecha procesos cuando es necesario para obtener memoria de todos modos, por lo que aunque logra limpiar algo de memoria, eso sucedería automáticamente si fuera necesario.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X