¿Android mata cada servicio o el proceso entero?

Muchos de nosotros sabemos que (en términos sueltos) un Service en Android será asesinado por el sistema si no llama a Service.startForeground() . Pero, ¿es esta toda la historia …?


Estoy trabajando en algún código heredado, portando una aplicación de permiso de "sistema" a la Play Store. Esta aplicación tiene 5 servicios de fondo (que no llaman startForeground() ), que hasta ahora, estaban a salvo, debido al permiso de "sistema" con el que funcionaba la aplicación. Se instaló en un dispositivo personalizado. Debido a plazos ajustados y presupuestos, la refactorización de estos 5 en 1 no es una solución a corto plazo, pero nos gustaría pasar a la versión beta abierta tan pronto como sea posible.

La pregunta corta es:

  • Si no hay Activity o Service primer plano, ¿Android mata cada servicio de fondo individual o simplemente mata el proceso en sí?

Aquí hay información de los documentos Android sobre Procesos e hilos que explica cómo Android finalizará los procesos bajo presión:

Android podría decidir cerrar un proceso en algún momento, cuando la memoria es baja y requerida por otros procesos que están más inmediatamente al servicio del usuario. Los componentes de la aplicación que se ejecutan en el proceso que se ha matado se destruyen en consecuencia. Un proceso se inicia de nuevo para esos componentes cuando hay trabajo de nuevo para ellos hacer.

Al decidir qué procesos matar, el sistema Android pesa su importancia relativa para el usuario. Por ejemplo, apaga más fácilmente un proceso de alojamiento de actividades que ya no son visibles en la pantalla, en comparación con un proceso de alojamiento de las actividades visibles. La decisión de terminar un proceso, por lo tanto, depende del estado de los componentes que se ejecutan en ese proceso.


El conocimiento común dice que " Android matará al Servicio "

La experiencia personal ha demostrado que Android también matará el proceso en sí (como se describe en la cita anterior). Esto se puede mostrar almacenando objetos en el objeto Application y observando que se reinicializan después de que el servicio se ha eliminado.


Teniendo en cuenta lo anterior, hay algunas opciones para resolver el problema :

1) Hacer la cosa correcta

Refactorice los 5 servicios en 1, ejecutándose en varios hilos diferentes. Lleve el servicio 1 al primer plano. Problema resuelto.

Lamentablemente no hay presupuesto para esto en este momento, y preferiríamos encontrar una solución rápida debido a los plazos del proyecto.

Esta es la solución final que se implementará hacia adelante en plena producción.

2) Muchas Notificaciones

Inicie cada servicio en primer plano, cada uno con su propio icono de Notification .

Esta es una solución desordenada, pero trabajará para los ensayos de campo beta, comprándonos algún tiempo.

Pienso en esto como el enfoque de "fuerza bruta".

3) Proceso protegido por un Servicio

Si es el proceso que se mata, en lugar de cada servicio individual, entonces será lo suficientemente bueno para tener un solo servicio en primer plano en ejecución.

Esto "evitaría" (es decir, disminuiría la probabilidad de que) Android destruyera el proceso.

Los 5 servicios sobrevivirían así.

4) Un Servicio para gobernarlos a todos

Los Documentos de Servicios nos dicen que si un servicio está vinculado a otro contexto, entonces

stopService () o stopSelf () no detiene el servicio hasta que todos los clientes se desvinculan.

¿Si enlazo a los otros servicios de un solo servicio del primero plano, los mantendrá todos vivos?


Asi que:

  • ¿Matará Android a cada servicio de fondo no enlazado?
  • ¿O simplemente acaba con la máquina virtual en la que se ejecuta la aplicación?

Actualizar

Después de 18 41 horas de prueba # 3 ( Proceso protegido por un Servicio ), los 6 servicios siguen funcionando (5 viejos más los 1 nuevos).

Por lo tanto, parece que Android mataría el proceso si no se ejecutan actividades o servicios en primer plano.

2 Solutions collect form web for “¿Android mata cada servicio o el proceso entero?”

Si no hay actividad o servicio en primer plano, ¿Android mata cada servicio de fondo individual o simplemente mata el proceso en sí?

Android no mata Activities o Services individuales, eso no tendría mucho sentido. Por ejemplo, si una Activity está en segundo plano Android nunca decidirá específicamente matar a esta Activity . No importa qué tipo de Object Java está en la memoria de todas las instancias de Object comparten el mismo destino: Si ya no son necesarios / utilizados serán recolectados basura. La gente a menudo habla de una Activity se mata cuando está en el fondo y que es realmente engañosa porque sólo significa que puede ser recogida de basura y, finalmente, será. Así que esta recolección de basura es lo que destruiría una instancia específica de un objeto. No tiene nada que ver con el dispositivo que tiene memoria baja.

Cuando Android se está quedando sin memoria decidirá matar todo un proceso, y como ya lees en la documentación elige los menos importantes.

Lo que estoy tratando de decirles es que esos son dos procesos fundamentalmente diferentes. Uno de ellos es el sistema operativo Android que mata no procesos importantes cuando se está quedando sin memoria y el otro es el recolector de basura que está constantemente buscando memoria ya no utilizada que puede liberar.

El conocimiento común dice que "Android matará al Servicio"

Como he explicado anteriormente, esto puede ser engañoso y no es completamente cierto, si el dispositivo se está quedando sin memoria que va a matar a todo el proceso, no sólo un Service específico. Esto es diferente al Service se recolecta cuando se deja de usar.


Y ahora a sus soluciones:

Refactorice los 5 servicios en 1, ejecutándose en varios hilos diferentes. Lleve el servicio 1 al primer plano. Problema resuelto.

Esto obviamente es la mejor opción, pero como usted dijo que no son capaces de implementar esto ahora.

Inicie cada servicio en primer plano, cada uno con su propio icono de notificación.

Esto sería una especie de mala solución, no hay razón para tener múltiples notificaciones. Las otras opciones son claramente mejores.

Si es el proceso que se mata, en lugar de cada servicio individual, entonces será lo suficientemente bueno para tener un solo servicio en primer plano en ejecución.

Esto definitivamente podría funcionar, lo intentaría.

Los Documentos de Servicios nos dicen que si un servicio está vinculado a otro contexto, entonces

stopService () o stopSelf () no detiene el servicio hasta que todos los clientes se desvinculan.

¿Si enlazo a los otros servicios de un solo servicio del primero plano, los mantendrá todos vivos?

Esta es la siguiente mejor opción en mi opinión.


Al principio pensé en iniciar cada Service en su propio proceso. Pero no estoy seguro de si esto es aplicable a usted. Especialmente si desea mantener todos los Services funcionando en todo momento. El beneficio de iniciar un Service en su propio proceso es, obviamente, que es independiente del resto de la aplicación. Así que incluso si alguna parte es muerta debido a restricciones de memoria el resto de la aplicación seguirá funcionando en el otro proceso.

¿Alguna vez has pensado en usar la herencia para resolver el problema? Podría ser la forma más sencilla de implementar su opción 1) .

Cada aplicación de Android es una bifurcación del proceso zigoto y tiene su propio proceso. Cada proceso de aplicación puede alojar más actividades y servicios: de manera tan definitiva, matar a un proceso (ejemplo: matar PID) matará todo lo que hay dentro.

Por defecto un servicio está en el mismo proceso de su aplicación; sin embargo, es posible dejar que un servicio se ejecute en un proceso separado dedicado, con declaración en el manifiesto:

 <service android:name=".MyService" android:isolatedProcess=true /> 
  • ¿Cómo utilizo Android SpeechRecognizer como servicio?
  • Actualización de la actividad TextView desde el servicio mediante vinculación de servicio
  • Android: Transmisión de datos entre servicio y actividad
  • Android geofencing cuando se mata la aplicación
  • BindService () devuelve false pero unbindService () necesita ser llamado?
  • Servicio que se ejecuta cada minuto
  • Android BroadcastReceiver, servicio de ejecución automática después del reinicio del dispositivo
  • Problema al ejecutar un script desde init.rc en el arranque del dispositivo
  • Cómo enviar la ubicación del dispositivo en el servidor cuando sea necesario
  • Desactivar ocultar una presentación (pantalla secundaria)
  • Servicio Android android.os.BinderProxy error
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.