Módulo 9: Agentes en Segundo Plano Ensamblado externo Ejecuta 30 minutos +/-10 minutos, según lo decida el Sistema Operativo Deben tardar máximo 25 segundos Se crean a través de la plantilla Windows Phone Scheduled Task Agent 1
Clase ScheduledTaskAgent Representa la tarea a ejecutar El método OnInvoke() es invocado cuando la tarea es ejecutada Usa NotifyComplete() para indicar que ha terminado la tarea Usa Abort() para cancelar la tarea protected override void OnInvoke(ScheduledTask task) // Código a ejecutar en la tarea NotifyComplete(); Clase PeriodicTask Representa una tarea programada que ejecuta en un tiempo corto La descripción debe ser detallada y amigable const string taskname = "MiTarea"; protected override void OnNavigatedTo(NavigationEventArgs e) var task = new PeriodicTask(taskName); task.description = "Esta es mi tarea"; Clase ScheduledActionService Registra las tareas programadas en el Sistema Operativo Solo debe haber una tarea con el mismo nombre const string taskname = "MiTarea"; protected override void OnNavigatedTo(NavigationEventArgs e) var task = new PeriodicTask(taskName); task.description = "Esta es mi tarea"; var oldtask = ScheduledActionService.Find(taskName); if (oldtask!= null) ScheduledActionService.Remove(taskName); ScheduledActionService.Add(task); 2
Clase ScheduledActionService Método LaunchForTestpermite ejecutar la tarea en un tiempo especificado const string taskname = "MiTarea"; protected override void OnNavigatedTo(NavigationEventArgs e) var task = new PeriodicTask(taskName); ScheduledActionService.LaunchForTest(taskName, TimeSpan.FromSeconds(10)); Demo: Tareas Intensivas 3
Tareas Intensivas Agentes para ejecutar por tiempos prolongados Hasta 10 minutos Restricciones Teléfono conectado a la carga eléctrica Uso de datos no celulares (Wi-Fi por ejemplo) 90% mínimo de batería Pantalla de Bloqueo activa Sin llamadas activas Tareas Intensivas Clase ResourceIntensiveTask Representa una tarea que ejecuta por tiempo prolongado y puede consumir recursos de manera intensa Mismo mecanismo que PeriodicTask const string taskname = "MiTarea"; protected override void OnNavigatedTo(NavigationEventArgs e) var task = new ResourceIntensiveTask(taskName); task.description = "Esta es mi tarea"; Consideraciones Podemos registrar solo una de cada tipo de tarea en nuestras aplicaciones 1 PeriodicTask 1 ResourceIntensiveTask Usa el mismo agente para ejecutar una u otra protected override void OnInvoke(ScheduledTask task) if (task is PeriodicTask) //Código para tarea periódica else //Código para tarea intensiva 4
Demo: Tareas Intensivas Background Transfer Service(BTS) Permite encolar cargas y descargas de tipo HTTP / HTTPS No requieren que la aplicación esté corriendo 5
Restricciones El fólder para las transferencias debe ser local/shared/transfers Tamaños 5MB máximo tamaño para la carga 20MB máximo para descarga por conexión celular 100MB máximo para descarga por Wi-Fi con batería Ilimitado para descarga por Wi-Fi con corriente eléctrica Etcétera Lista completa de restricciones: http://tinyurl.com/wp8btsrestrictions Clase BackgroundTransferRequest Representa una solicitud de transferencia var remoteuri = new Uri("http://...MVVM-1.mp4", UriKind.Absolute); var localuri = new Uri("/shared/transfers/MVVM-1.mp4", UriKind.Relative); var request = new BackgroundTransferRequest(remoteUri, localuri); Clase BackgroundTransferRequest Propiedades adicionales: Headers Method Tag TotalBytesToReceive TotalBytesToSend TransferError TransferPreferences TransferStatus TransferProgressChanged TransferStatusChanged Headers para el request Verbo a utilizar (GET o POST) Datosadicionales para el request Total de bytes a recibir Total de bytes a enviar Indica el error de la transferencia Condiciones para realizar la transferencia. Por ejemplo, permitir la transferencia aún en batería Enumerador que indica el estatusde la transferencia Se dispara cuando el progreso de la transferencia ha cambiado Se dispara cuando la propiedad TransferStatusha cambiado 6
Clase BackgroundTransferService Gestiona las transferencias Agrega una solicitud BackgroundTransferService.Add(request); Remueve una solicitud BackgroundTransferService.Remove(request); Consulta todas las solicitudes activas list.itemssource = BackgroundTransferService.Requests; BackgroundTransferService.Requests Es una fotografía de las solicitudes Para conocer el progreso de cada transferencia, maneja el evento TransferProgressChanged Para conocer el cambio de estatus de cada transferencia, maneja el evento TransferStatusChanged foreach (var item in BackgroundTransferService.Requests) item.transferprogresschanged += item_transferprogresschanged; item.transferstatuschanged += item_transferstatuschanged; Demo: 7
Resumen Preguntas? 8