Android – ¿Cómo decidir si ejecutar un servicio en un proceso separado?

Estoy trabajando en una aplicación de Android que recopila datos de sensores durante varias horas. Para ello contamos con un Servicio que recoge los Datos del Sensor (por ejemplo, Aceleración, GPS, ..), realiza algún procesamiento y los almacena de forma remota en un servidor.

En la actualidad, este servicio se ejecuta en un proceso independiente (utilizando android: service = ": background" en el manifiesto). Esto complica la comunicación entre las Actividades y el Servicio, pero mis predecesores crearon la Aplicación de esta manera porque pensaban que separar el Servicio de las Actividades lo haría más estable.

Quisiera algunas razones más fácticas para el esfuerzo de funcionar un proceso separado. ¿Cuáles son las ventajas? ¿Funciona realmente más estable? ¿Es menos probable que el Servicio muera por el sistema operativo (para liberar recursos) si se encuentra en un proceso separado?

Nuestra aplicación utiliza startForeground () y amigos para minimizar la posibilidad de ser asesinado por el sistema operativo.

Los documentos Android no son muy específicos acerca de esto, la mayoría de los estados que depende del propósito de la aplicación 😉

TL; DR ¿Cuáles son razones objetivas para poner un servicio de larga duración en un proceso separado (en Android)?

4 Solutions collect form web for “Android – ¿Cómo decidir si ejecutar un servicio en un proceso separado?”

El primer punto para comenzar es leer la descripción de los ciclos de vida de los componentes . La toma de que es que realmente no están garantizados que un Service u otro componente se le permitirá correr durante un largo período de tiempo.

Sin embargo, suena como un Service es la opción correcta para la funcionalidad que describe. Esto se debe a que está realizando algunas operaciones que no se enfrentan al usuario. Volviendo a la descripción del ciclo de vida, cada vez que una Actividad no está en primer plano, es esencialmente un candidato para ser asesinado.

Lo que debe considerar hacer es usar AlarmManager para activar periódicamente su Service . Es posible que también desee ver utilizando la biblioteca WakefulIntent que @CommonsWare ha creado.

Hay un buen artículo que describe la multitarea y los procesos en el blog de Android llamado Multitasking the Android Way que puede obtener algunos de los detalles más sobre los procesos que le interesan. Por ejemplo:

Un malentendido común sobre la multitarea de Android es la diferencia entre un proceso y una aplicación. En Android, estas no son entidades estrechamente acopladas: las aplicaciones pueden parecer presentes para el usuario sin un proceso real que esté ejecutando la aplicación; Múltiples aplicaciones pueden compartir procesos, o una aplicación puede hacer uso de múltiples procesos dependiendo de sus necesidades; Los procesos de una aplicación pueden ser mantenidos por Android incluso cuando esa aplicación no está haciendo algo activamente.

Uso reducido de RAM

La documentación para desarrolladores de Android sugiere que esto podría ser apropiado para mantener el uso de memoria RAM del servicio hacia abajo.

Desde la gestión de la memoria de la aplicación: Utilice varios procesos :

Un ejemplo de cuándo varios procesos pueden ser apropiados es cuando se construye un reproductor de música que reproduce música de un servicio durante un período largo de tiempo. Si toda la aplicación se ejecuta en un proceso, muchas de las asignaciones realizadas para su UI de actividad deben mantenerse mientras esté reproduciendo música, incluso si el usuario está actualmente en otra aplicación y el servicio está controlando la reproducción. Una aplicación como esta puede dividirse en dos procesos: uno para su interfaz de usuario y otro para el trabajo que continúa ejecutándose en el servicio de fondo.

Por lo tanto, la ejecución del servicio en un proceso separado podría reducir el impacto de rendimiento de la aplicación al tiempo que reduce la probabilidad de que el servicio se mate cuando el sistema tiene poca memoria RAM.

Reducción del impacto en el rendimiento

Desde la gestión de la memoria de la aplicación: Cambio de aplicaciones :

Si su aplicación tiene un proceso en caché y retiene la memoria que actualmente no necesita, su aplicación, incluso mientras el usuario no la está utilizando, está restringiendo el rendimiento general del sistema. Por lo tanto, como el sistema tiene poca memoria, puede matar los procesos en la caché LRU comenzando con el proceso usado menos recientemente, pero también dando cierta consideración hacia los procesos que requieren más memoria.

Probabilidad reducida de ser asesinado

Desde la gestión de la memoria de la aplicación: libera la memoria cuando la memoria se vuelve apretada :

Nota: Cuando el sistema comienza a matar los procesos en la memoria caché de LRU, aunque funciona principalmente de abajo hacia arriba, da cierta consideración a los procesos que consumen más memoria y proporcionará al sistema más ganancia de memoria si se mata. Por lo tanto, menos memoria consumirá mientras esté en la lista LRU en general, mejor serán sus posibilidades de permanecer en la lista y poder reanudar rápidamente.

Por lo tanto, su servicio es menos probable que se maten cuando está en un proceso separado, ya que el uso del RAM del proceso será menor ya que el servicio no está compartiendo recursos de la interfaz de usuario.

Cuándo hacer esto

Si su servicio no utiliza startForeground() , he descubierto que Android solo lo matará cuando necesite liberar RAM, por lo que el consumo de RAM del servicio no es demasiado importante. Así que si usted está considerando el impacto de rendimiento en el sistema operativo y otras aplicaciones, no creo que valga la pena ejecutar el servicio en un proceso separado.

Sin embargo, si usas startForeground() , Android intentará mantener tu servicio vivo tanto como sea posible, por lo que cualquier RAM que el proceso use afectará al sistema operativo y otras aplicaciones. Por lo tanto, en este caso, recomiendo usar un proceso separado, que podría ahorrar al menos 10 MB de RAM, por lo que no ralentizar los dispositivos de los usuarios.

Además, tenga en cuenta que hacer su aplicación multi-proceso no es fácil; SharedPreferences de Android no admite varios procesos. He realizado una implementación de SharedPreferences varios procesos en uno de mis proyectos , pero todavía no lo he publicado para su reutilización.

La ejecución de un servicio en su propio proceso tiene las pequeñas ventajas de que el recolector de basura para el servicio no afecta a su aplicación y que la huella de memoria del servicio es un poco menor si se ejecuta solo.

Si el consumo del servicio por otras aplicaciones no es un requisito para usted, prefiero un servicio local. Alternativamente, puede ejecutar el servicio en su propio proceso y utilizar diferentes comunicaciones con su aplicación, por ejemplo, a través de un receptor de difusión. Consulte el tutorial de servicio de Android para obtener detalles.

Separar el servicio para que se ejecute en un proceso diferente no lo hace más estable, pero en algunos casos, hace que su aplicación sea más estable, ya que si este servicio falla, su aplicación no se bloqueará y podrá recuperarse.

Eli

  • Actualización de Textview en una actividad con servicio local
  • Servicio de asignar un montón de memoria?
  • En Android: ¿Cómo llamar a la función de la actividad de un servicio?
  • ¿Cómo mantener un servicio con los oyentes vivo después de desatar en Android?
  • Grabar sonido Y reproducir sonido modulado En Android?
  • ¿Es posible ejecutar mi servicio por tiempo indefinido?
  • Android Service.startForeground NO respeta la id unicidad de notificación
  • Android: mantener el servicio en ejecución cuando se mata la aplicación
  • Android startService () tarda mucho tiempo en volver al subproceso de interfaz de usuario
  • ¿Cómo comprobar el permiso automático de MIUI mediante programación?
  • NsdManager no resuelve varios servicios descubiertos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.