proyectos - manual programacion android
¿Android mata a cada servicio o al proceso completo? (2)
Si no hay actividad o servicio de primer plano, ¿Android mata a cada servicio de fondo individual o simplemente mata el proceso?
Android no mata las Activities
o Services
individuales, eso no tendría mucho sentido. Por ejemplo, si una Activity
está en segundo plano, Android nunca decidirá matar específicamente esta Activity
. No importa qué tipo de Object
Java esté en la memoria, todas esas instancias de Object
comparten el mismo destino: si ya no son necesarios / utilizados, se recolectarán como basura. La gente suele hablar de que se está matando una Activity
cuando está en segundo plano y eso es realmente engañoso porque solo significa que puede ser recogida de basura y eventualmente lo será. Entonces, esta recolección de basura es lo que destruiría una instancia específica de un objeto. No tiene nada que ver con que el dispositivo tenga poca memoria.
Cuando Android se esté quedando sin memoria, decidirá finalizar todo un proceso y, como ya ha leído en la documentación, elige los menos importantes.
Lo que estoy tratando de decirles es que esos son dos procesos fundamentalmente diferentes. Uno es el sistema operativo Android que no mata los procesos importantes cuando se está quedando sin memoria y el otro es el recolector de basura que busca constantemente la memoria que ya no se usa y que se puede liberar.
El conocimiento común dice que "Android matará el servicio"
Como expliqué anteriormente, esto puede ser engañoso y no es del todo cierto, si el dispositivo se está quedando sin memoria, eliminará todo el proceso, no solo un Service
específico. Esto es diferente del Service
se recolecta cuando ya no se usa.
Y ahora a sus soluciones:
Refactoriza los 5 servicios en 1, ejecutándose en varios subprocesos diferentes. Poner el servicio 1 en primer plano. Problema resuelto.
Obviamente, esta es la mejor opción, pero como usted dijo, no puede implementar esto ahora.
Inicie cada servicio en primer plano, cada uno con su propio icono de Notificación.
Esto sería un tipo de mala solución, no hay razón para tener múltiples notificaciones. Las otras opciones son claramente mejores.
Si es el proceso el que se elimina, en lugar de cada servicio individual, será lo suficientemente bueno como para tener un solo servicio en primer plano en ejecución.
Esto definitivamente podría funcionar, lo intentaría.
Los documentos en 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 me conecto a los otros servicios desde un único servicio en primer plano, ¿eso los mantendrá vivos a todos?
Esta es la siguiente mejor opción en mi opinión.
Inicialmente pensé en comenzar 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. Entonces, incluso si alguna parte se cancela debido a limitaciones de memoria, el resto de la aplicación continuará ejecutándose 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) .
Muchos de nosotros sabemos que (en términos vagos) el sistema Service.startForeground()
un Service
en Android si no llama a Service.startForeground()
. ¿Pero es esta la historia completa ...?
Estoy trabajando en un código heredado, transfiriendo una aplicación de permisos de "sistema" a Play Store. Esta aplicación tiene 5 servicios en segundo plano (que no llaman startForeground()
), que hasta ahora, eran seguros, debido al permiso del "sistema" con el que se ejecutaba la aplicación. Fue instalado en un dispositivo personalizado. Debido a los plazos ajustados y los presupuestos, refactorizar estos 5 en 1 no es una solución a corto plazo, pero nos gustaría pasar a abrir la versión beta lo antes posible.
La pregunta corta es:
- Si no hay
Activity
oService
primer plano, ¿Android mata a cada servicio de fondo individual o simplemente mata el proceso?
Aquí hay algo de información de los documentos de Android sobre procesos y subprocesos que explica cómo Android terminará los procesos cuando esté bajo presión:
Android puede decidir cerrar un proceso en algún momento, cuando la memoria es baja y requerida por otros procesos que están sirviendo al usuario de forma más inmediata. Los componentes de la aplicación que se ejecutan en el proceso que se eliminan se destruyen. Se vuelve a iniciar un proceso para esos componentes cuando, nuevamente, hay trabajo por hacer.
Al decidir qué procesos matar, el sistema Android pesa su importancia relativa para el usuario. Por ejemplo, más fácilmente cierra un proceso que aloja actividades que ya no son visibles en la pantalla, en comparación con un proceso que aloja 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á el servicio "
La experiencia personal ha demostrado que Android también eliminará el proceso (como se describe en la cita anterior). Esto se puede mostrar almacenando objetos en el objeto de la Application
y notando que se reinicializan después de que se termina el servicio.
Con lo anterior en mente, hay algunas opciones para resolver el problema :
1) Hacer lo correcto
Refactoriza los 5 servicios en 1, ejecutándose en varios subprocesos diferentes. Poner el servicio 1 en 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 la producción total.
2) Muchas notificaciones
Inicie cada servicio en primer plano, cada uno con su propio icono de Notification
.
Esta es una solución desordenada, pero funcionará para las pruebas de campo beta, lo que nos permite ganar algo de tiempo.
Pienso en esto como el enfoque de la "fuerza bruta".
3) Proceso protegido por un servicio
Si es el proceso el que se elimina, en lugar de cada servicio individual, será lo suficientemente bueno como para tener un solo servicio en primer plano en ejecución.
Esto "evitaría" (es decir, reduciría la probabilidad de) que Android mate el proceso.
Los 5 servicios así sobrevivirían.
4) Un servicio para gobernarlos a todos.
Los documentos en 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 me conecto a los otros servicios desde un único servicio en primer plano, ¿eso los mantendrá vivos a todos?
Asi que:
- ¿Android mata a cada servicio de fondo sin consolidar?
- ¿O simplemente mata la máquina virtual en la que se está ejecutando la aplicación?
Actualizar
Después de 18 41 horas de prueba # 3 ( Proceso protegido por un Servicio ), los 6 servicios todavía se están ejecutando (5 antiguos más el 1 nuevo).
Por lo tanto, parece que Android acabaría con el proceso si no se ejecutan actividades o servicios en primer plano.
Cada aplicación de Android es una bifurcación del proceso de cigoto y tiene su propio proceso. Cada proceso de aplicación puede alojar más actividades y servicios: así, definitivamente, matar un proceso (por ejemplo, matar PID) matará todo lo que está dentro.
Por defecto, un servicio está en el mismo proceso de su aplicación; sin embargo, es posible, permitir que un servicio se ejecute en un proceso separado dedicado, con declaración en el manifiesto:
<service android:name=".MyService"
android:isolatedProcess=true />