Como su nombre lo indica, nos van a permitir ejecutar trabajos en Segundo plano, aún cuando la aplicación no esté activa.

OJO: No están disponibles para los aparatos que solo tienen 256Mb de memoria.

Tipos de Tareas:

Periódicas

Corren en un pequeño intervalo y recurrentemente. Por ejemplo para informar la locación del dispositivo y ejecutar sincronizaciones de poco tamaño.

Intensivas

(En Recursos) Largos períodos de ejecución cuando el teléfono cumple ciertas características de uso (actividad de cpu, fuente de poder, tipo de red. Útil para sincronizar grandes cantidades de datos al teléfono cuando no está siendo usado.

Una app solo puede tener un agente de estos, que puede ejecutar ambos tipos de tareas.

Restricciones:

Existen unas apis que no se pueden usar dentro de las tareas que ejecutan los agentes: Cámara, vibración, radio, sensores, notificaciones, XNA, y otras que encuentran aquí.

La geolocalización está disponible de manera restringida, ya que no reporta la ubicación real, sino que hace un cache cada 15 minutos, sin embargo, acciones como las que usan los HttpWebRequests desde los agentes sí se pueden hacer sin problema.

Los agentes no pueden usar más de 6MB, excepto cuando manejan audio, en cuyo caso tienen hasta 15Mb. Cuando se exceden estos límites, la tarea se apaga de inmediato. Cuando cualquier tarea es apagada dos veces debido a un alto empleo de la memoria, dicha tarea es removida del agendamiento de tareas del teléfono. Es útil recordar que estos límites no aplican en modo debug, por lo que es necesario emplear el API ApplicationMemoryUsageLimit para verificar cuánto está empleando la tarea en tiempo de depuración.

Los agendamientos de las tareas no se pueden hacer por un tiempo mayor a dos semanas. Para poder reagendar, la app tienen que ejecutarse en primer plano.

Cuando se tienen agentes periódicos, lo normal es que corran mínimo cada 30 minutos. Este tiempo puede desfasarse hasta en 10 minutos, debido a otras tareas que están en segundo plano. La ejecución no debe ser mayor a 25 segundos.

WP7 tiene un modo de operación llamado Battery Saver: Este modo que solo se puede habilitar por el usuario, podría impedir que los agentes periódicos se ejecuten.

WP7 tiene una restricción acerca de la cantidad de agentes que pueden estar corriendo en un dispositivo dado y esta puede ser tan pequeña como 6. Antes de este límite, WP7 puede lanzar mensajes al usuario que indiquen que la cantidad de agentes está subiendo mucho y puede que la batería se agote más rápido. Si el límite ya se ha cumplido, cuando la app trata de agregar una nueva tarea, habrá una excepción de tipo InvalidOperationException que debería ser manejada para que la app no se estrelle por este motivo.

Hay documentación de buenas prácticas que pueden encontrar aquí. En el caso de los agentes intensivos, estos pueden durar ejecutándose hasta 10 minutos. No pueden correr a menos que el dispositivo tenga más de 90% de batería, la pantalla esté bloqueada, no exista una llamada activa, esté conectado a una fuente de poder externa y a datos en una red distinta a la red celular. Si una tarea intensiva comienza a ejecutarse y por algún motivo alguna de las condiciones anteriores deja de cumplirse, de inmediato la tarea es terminada.

Es bueno tener en cuenta que estas tareas intensivas pueden llegar a no ejecutarse nunca, debido a la gran cantidad de condiciones impuestas. Por ejemplo si el usuario no tiene WiFi en ningún lado, la tarea nunca se ejecutará.

En mi sitio de preguntas y respuestas he respondido algunas preguntas acerca de los agentes en background:

1. Hay alguna forma de manejar con código en wp7 que un agente sea suspendido porque hay bajos recursos de memoria o de batería?

2. En wp7, se pueden concatenar varios agentes periódicos para lograr tener reportes cada 2 minutos en vez de cada 30?

3. Es posible evitar a través de código que un usuario de WP7 apague los agentes de ejecución en background?


Bien; ya que vimos las generalidades, si quieres incluir Background Agents en tu app, sigue este link, donde nos enseñan cómo implementarlos.