Cómo optimizar el uso de la batería para las APIs de programación de tareas

En esta página, se sugieren algunas prácticas recomendadas para configurar tareas en segundo plano que se comportan bien. Estas prácticas recomendadas están diseñadas específicamente para reducir el consumo de batería, pero también pueden mejorar el rendimiento del dispositivo de otras maneras, como reducir el uso de red.

Elige restricciones óptimas y combina tareas

Para minimizar la carga que colocan las tareas en el dispositivo, es importante especificar restricciones óptimas. (Para las tareas de JobScheduler, consulta JobInfo.Builder para ver la lista de restricciones). Por ejemplo, si quieres asegurarte de que tu app no agote la batería, te recomendamos especificar la restricción RequiresCharging. Esta restricción le indica al sistema que no ejecute la tarea, a menos que el nivel de batería esté aumentando. Del mismo modo, el uso de Wi-Fi suele requerir menos energía que los datos móviles. Por lo tanto, si tu tarea necesita una conexión de red, pero puede esperar hasta que haya una red no medida disponible, te recomendamos establecer una restricción NetworkType.UNMETERED.

Además, si hay varias tareas similares que se regirán por las mismas restricciones, suele ser una buena idea combinarlas en una sola tarea, de modo que el dispositivo solo se active una vez. Por ejemplo, supongamos que tu app tiene tres conjuntos de datos diferentes que necesita para sincronizarse con el almacenamiento en la nube. En lugar de programar tres tareas diferentes (una para cada conjunto de datos), suele ser una mejor idea programar una sola tarea de "sincronización de datos", definir las restricciones adecuadas y permitir que esa tarea realice toda la sincronización de datos pendiente cuando se ejecute.

Dicho esto, no deberías intentar combinar tareas no relacionadas en una sola tarea integral. En cambio, solo asegúrate de otorgar a cada tarea las restricciones adecuadas. Por ejemplo, si las tareas son de prioridad baja, asegúrate de especificar que deben ejecutarse cuando el dispositivo está inactivo y cargándose. De esa manera, aunque el dispositivo se active varias veces, no afectará la experiencia del usuario ni la duración de la batería.

Solo marca las tareas como aceleradas cuando sean urgentes

Si una tarea es particularmente urgente, puedes marcarla como acelerada. (Para las tareas de JobScheduler, llama a JobInfo.Builder.setExpedited(true)). Al hacerlo, se prioriza la tarea de varias maneras. Por ejemplo, el sistema ejecuta esas tareas de inmediato cuando puede hacerlo, y es menos probable que las restricciones de administración de batería afecten las tareas aceleradas.

Por estos motivos, debes tener cuidado de solo marcar una tarea como acelerada cuando lo necesites. Debido a que las tareas aceleradas pueden anular algunas eficiencias del sistema, estas pueden consumir más energía que si no estuvieran marcadas de esa manera.

Solo debes marcar una tarea como acelerada si es urgente, y la experiencia del usuario se vería afectada si la tarea tardara más en ejecutarse. Por ejemplo, si tu app ejecuta una tarea para controlar un mensaje de FCM de alta prioridad, ese es un motivo adecuado para marcar la tarea como acelerada. Sin embargo, no debes marcar una tarea como acelerada solo para anular las optimizaciones del sistema.

Verifica por qué se detuvieron tus tareas

Si tus tareas se detienen antes de finalizar, puedes llamar a WorkInfo.getStopReason() para verificar el motivo de su detención. (Para las tareas de JobScheduler, llama a JobParameters.getStopReason()). Es importante hacerlo por dos motivos. En primer lugar, debes completar tus tareas. Averiguar por qué se detuvieron tus tareas te ayuda a evitar situaciones similares. Sin embargo, también es probable que el sistema detenga las tareas debido a un comportamiento que usa demasiados recursos del sistema. No quieres que tu app sea una mala elección, ya que usa la batería o la red de forma innecesaria.

Por ejemplo, si tus tareas se detienen frecuentemente con el motivo STOP_REASON_TIMEOUT, puede haber un caso límite que a veces lleve mucho más de lo esperado.

Te recomendamos que uses tu motor de estadísticas para realizar un seguimiento si se detienen las tareas de tu app y por qué.