Hacer que tu aplicación sea compatible con las tareas en segundo plano

Los temas de esta sección muestran cómo hacer que un código ligero se ejecute en segundo plano en respuesta a desencadenadores. Puedes usar tareas en segundo plano para proporcionar funcionalidad cuando la aplicación esté suspendida o no se esté ejecutando. También puedes usar tareas en segundo plano para aplicaciones de comunicación en tiempo real como VOIP, correo y mensajería instantánea.

Reproducir elementos multimedia en segundo plano

A partir de la versión 1607 de Windows 10, la reproducción de audio en segundo plano es mucho más fácil. Consulta Reproducir elementos multimedia en segundo plano.

Tareas en segundo plano dentro y fuera de proceso

Hay dos enfoques para implementar tareas en segundo plano:

  • En proceso: la aplicación y su proceso en segundo plano se ejecutan en el mismo proceso.
  • Fuera de proceso: la aplicación y el proceso en segundo plano se ejecutan en procesos independientes.

Con la versión 1607 de Windows 10, se introdujo la admisión del segundo plano en proceso para simplificar la escritura de las tareas en segundo plano. Pero todavía se pueden escribir tareas fuera del proceso en segundo plano. Consulta Directrices para tareas en segundo plano para ver recomendaciones sobre cuándo escribir una tarea en segundo plano en proceso o fuera de proceso.

Las tareas en segundo plano fuera de proceso son más resistentes porque el proceso en segundo plano no puede reducir el proceso de la aplicación si algo va mal. Pero la resistencia llega al precio de una mayor complejidad para administrar la comunicación entre procesos entre la aplicación y la tarea en segundo plano.

Las tareas en segundo plano fuera de proceso se implementan como clases ligeras que implementan la interfaz IBackgroundTask que el sistema operativo se ejecuta en un proceso independiente (backgroundtaskhost.exe). Registre una tarea en segundo plano mediante la clase BackgroundTaskBuilder . El nombre de la clase se especifica como punto de entrada al registrar la tarea en segundo plano.

Con la versión 1607 de Windows 10, puedes habilitar la actividad en segundo plano sin tener que crear una tarea en segundo plano. En su lugar, puede ejecutar el código en segundo plano directamente dentro del proceso de la aplicación en primer plano.

Para comenzar rápidamente con las tareas en segundo plano dentro de proceso, consulta Crear y registrar una tarea en segundo plano dentro de proceso.

Para comenzar rápidamente con las tareas en segundo plano fuera de proceso, consulta Crear y registrar una tarea en segundo plano fuera de proceso.

Sugerencia

 A partir de Windows 10, ya no necesitarás colocar una aplicación en la pantalla de bloqueo como requisito previo para registrarle una tarea en segundo plano.

Tareas en segundo plano para eventos del sistema

Puedes hacer que tu aplicación responda a eventos generados por el sistema registrando una tarea en segundo plano con la clase SystemTrigger. Una aplicación puede usar cualquiera de los siguientes desencadenadores de eventos del sistema (definidos en SystemTriggerType)

Nombre del desencadenador Descripción
InternetAvailable Internet pasa a estar disponible.
NetworkStateChange Se produce un cambio en la red, como un cambio en el costo o la conectividad.
OnlineIdConnectedStateChange Cambia el identificador en línea asociado a la cuenta.
SmsReceived Se ha recibido un nuevo mensaje SMS por un dispositivo instalado de banda ancha móvil.
TimeZoneChange La zona horaria cambia en el dispositivo (por ejemplo, cuando el sistema ajusta el reloj al horario de verano).

Para obtener más información, consulta Responder a eventos del sistema con tareas en segundo plano.

Condiciones para tareas en segundo plano

Puedes controlar cuándo se ejecuta la tarea en segundo plano, incluso después de que se desencadene, agregando una condición. Una vez desencadenada, la tarea en segundo plano no se ejecutará hasta que se cumplan todas las condiciones. Se pueden usar las siguientes condiciones (representadas por la enumeración SystemConditionType).

Nombre de condición Descripción
InternetAvailable Internet debe estar disponible.
InternetNotAvailable Internet no debe estar disponible.
SessionConnected La sesión debe estar conectada.
SessionDisconnected La sesión no debe estar conectada.
UserNotPresent El usuario debe estar ausente.
UserPresent El usuario debe estar presente.

Agregue la condición InternetAvailable a su tarea en segundo plano BackgroundTaskBuilder.AddCondition para retrasar la activación de la tarea en segundo plano hasta que la pila de red se ejecute. Esta condición ahorra energía porque la tarea en segundo plano no se ejecutará hasta que la red esté disponible. Esta condición no proporciona una activación en tiempo real.

Si la tarea en segundo plano requiere conectividad de red, establezca IsNetworkRequested para asegurarse de que la red permanece activa mientras se ejecuta la tarea en segundo plano. Esto indica a la infraestructura de tareas en segundo plano que debe mantener la red mientras se esté ejecutando la tarea, incluso si el dispositivo ha entrado en modo de espera conectado. Si la tarea en segundo plano no establece IsNetworkRequested, la tarea en segundo plano no podrá acceder a la red cuando se encuentra en modo de espera conectado (por ejemplo, cuando la pantalla de un teléfono está desactivada). Para obtener más información sobre las condiciones de tarea en segundo plano, consulta Establecer condiciones para ejecutar una tarea en segundo plano.

Requisitos del manifiesto de aplicación

Antes de que la aplicación pueda registrar correctamente una tarea en segundo plano que se ejecuta fuera de proceso, debe estar declarada en el manifiesto de la aplicación. Las tareas en segundo plano que se ejecutan en el mismo proceso que su aplicación de host no necesitan declararse en el manifiesto de la aplicación. Para obtener más información, consulta Declarar tareas en segundo plano en el manifiesto de la aplicación.

Tareas en segundo plano

Los siguientes desencadenadores en tiempo real pueden usarse para ejecutar el código personalizado ligero en segundo plano:

Desencadenador en tiempo real Descripción
Canal de control Las tareas en segundo plano pueden mantener una conexión activa y recibir mensajes en el canal de control mediante la clase ControlChannelTrigger. Si tu aplicación está escuchando un socket, puedes usar el agente de socket en lugar de la clase ControlChannelTrigger. Para más información sobre el uso del agente de socket, consulta SocketActivityTrigger. La clase ControlChannelTrigger no es compatible con Windows Phone.
Temporizador Las tareas en segundo plano se pueden ejecutar cada 15 minutos y se pueden configurar para ejecutarse a una determinada hora mediante el control TimeTrigger. Para obtener más información, consulta Ejecutar una tarea en segundo plano en un temporizador.
Notificación push Las tareas en segundo plano responden a la clase PushNotificationTrigger para recibir notificaciones de inserción sin procesar.

Note  

Las aplicaciones universales de Windows deben llamar a RequestAccessAsync antes de registrar cualquier tipo de desencadenador en segundo plano.

Para garantizar que la aplicación universal de Windows continúe funcionando correctamente después de publicar una actualización, llama a RemoveAccess y luego a RequestAccessAsync cuando se inicia la aplicación tras su actualización. Para obtener más información, vea Directrices para tareas en segundo plano.

Límites en el número de instancias de desencadenador: Hay límites para el número de instancias de algunos desencadenadores que puede registrar una aplicación. Una aplicación solo puede registrar ApplicationTrigger, MediaProcessingTrigger y DeviceUseTrigger una vez por instancia de la aplicación. Si una aplicación supera este límite, el registro producirá una excepción.

Desencadenadores de eventos del sistema

La enumeración SystemTriggerType representa los siguientes desencadenadores de eventos del sistema:

Nombre del desencadenador Descripción
UserPresent La tarea en segundo plano se desencadena cuando el usuario pasa a estar presente.
UserAway La tarea en segundo plano se desencadena cuando el usuario pasa a estar ausente.
ControlChannelReset La tarea en segundo plano se desencadena cuando se restablece un canal de control.
SessionConnected La tarea en segundo plano se desencadena cuando se conecta la sesión,

  Los siguientes desencadenadores de eventos del sistema indican cuándo el usuario ha movido una aplicación o desactivado la pantalla de bloqueo.

Nombre del desencadenador Descripción
LockScreenApplicationAdded Un icono dinámico de la aplicación se agrega a la pantalla de bloqueo.
LockScreenApplicationRemoved Un icono dinámico de la aplicación se quita de la pantalla de bloqueo.

 

Restricciones de recursos de las tareas en segundo plano

Las tareas en segundo plano son ligeras. Mantener la ejecución en segundo plano en unos mínimos garantiza la mejor experiencia del usuario con las aplicaciones en primer plano y una mayor vida de la batería. Esto se logra aplicando restricciones de recursos a las tareas en segundo plano.

Las tareas en segundo plano se limitan a 30 segundos de uso.

Restricciones de memoria

Debido a las restricciones de recursos para los dispositivos con poca memoria, las tareas en segundo plano pueden tener un límite de memoria que determina la cantidad máxima de memoria que puede usar la tarea en segundo plano. Si la tarea en segundo plano intenta realizar una operación que superaría este límite, no se podrá realizar la operación y puede que esta genere una excepción de falta de memoria que puede controlar la tarea. Si la tarea no controla la excepción de falta de memoria o la naturaleza de la operación intentada es tal que no se genera una excepción de falta de memoria, la tarea se finalizará inmediatamente.

Puedes usar las API MemoryManager para consultar el uso de memoria actual y limitarlo para descubrir tu límite (si existe) y para supervisar el uso de memoria en curso de la tarea en segundo plano.

Límite por dispositivo para aplicaciones con tareas en segundo plano para dispositivos de baja memoria

En los dispositivos con restricciones de memoria, existe un límite en el número de aplicaciones que se pueden instalar en un dispositivo y en el uso de tareas en segundo plano en cualquier momento. Si se supera este número, no se podrá realizar la llamada a RequestAccessAsync, que es necesaria para registrar todas las tareas en segundo plano.

Ahorro de batería

A menos que permitas que tu aplicación siga ejecutando tareas en segundo plano y recibiendo notificaciones de inserción cuando el Ahorro de batería está activado, cuando se habilite la característica Ahorro de batería, esta evitará la ejecución de las tareas en segundo plano cuando el dispositivo no esté conectado a alimentación externa y la batería tenga un nivel de carga restante inferior al especificado. Esto no impide que puedas registrar tareas en segundo plano.

Sin embargo, para aplicaciones empresariales y aplicaciones que no se publicarán en Microsoft Store, consulta Ejecutar en segundo plano indefinidamente para aprender a usar una funcionalidad para ejecutar una tarea en segundo plano o una sesión de ejecución extendida en segundo plano indefinidamente.

Los recursos de tareas en segundo plano garantizan la comunicación en tiempo real.

Para evitar que las cuotas de recursos interfieran con la funcionalidad de comunicación en tiempo real, las tareas en segundo plano que usan el ControlChannelTrigger y el PushNotificationTrigger reciben cuotas de recursos de CPU garantizadas para todas las tareas en ejecución. Las cuotas de recursos son las mencionadas anteriormente y permanecen constantes para estas tareas en segundo plano.

Tu aplicación no tiene que hacer nada de forma distinta para obtener las cuotas de recursos garantizadas para las tareas en segundo plano ControlChannelTrigger y PushNotificationTrigger. El sistema siempre trata estas tareas como tareas en segundo plano críticas.

Desencadenador de mantenimiento

Las tareas de mantenimiento solo se ejecutan cuando el dispositivo está conectado a la corriente alterna. Para obtener más información, consulta Usar un desencadenador de mantenimiento.

Tareas en segundo plano para sensores y dispositivos

La aplicación puede acceder a sensores y dispositivos periféricos desde una tarea en segundo plano mediante la clase DeviceUseTrigger. Puedes usar este desencadenador para operaciones de larga duración como, por ejemplo, la sincronización o supervisión de datos. A diferencia de las tareas para eventos del sistema, una tarea DeviceUseTrigger solo se puede desencadenar mientras tu aplicación se está ejecutando en primer plano y no se puede establecer en ella ninguna condición.

Importante

Las clases DeviceUseTrigger y DeviceServicingTrigger no pueden usarse con tareas en segundo plano dentro de proceso.

Algunas operaciones críticas del dispositivo, como las actualizaciones del firmware que se ejecutan durante mucho tiempo, no se pueden realizar con DeviceUseTrigger. Esas operaciones solo se pueden realizar en el equipo y solo las puede realizar una aplicación privilegiada que use DeviceServicingTrigger. Una aplicación privilegiada es una aplicación que ha recibido la autorización del fabricante del dispositivo para realizar esas operaciones. Los metadatos del dispositivo se usan para especificar qué aplicación, si es el caso, se ha designado como aplicación privilegiada para un dispositivo. Para obtener más información, consulta Sincronización y actualización de dispositivos para aplicaciones de dispositivo de Microsoft Store.

Administrar tareas en segundo plano

Las tareas en segundo plano pueden notificar progreso, finalización o cancelación a tu aplicación usando eventos y almacenamiento local. La aplicación también puede capturar excepciones generadas por una tarea en segundo plano, y administrar el registro de tareas en segundo plano durante las actualizaciones de la aplicación. Para más información, consulte:

Controlar una tarea en segundo plano cancelada
Supervisar el progreso y la finalización de tareas en segundo plano

Compruebe el registro de tareas en segundo plano durante el inicio de la aplicación. Asegúrate de que las tareas en segundo plano no agrupadas de la aplicación están presentes en BackgroundTaskBuilder.AllTasks. Vuelva a registrar los que no están presentes. Anule el registro de las tareas que ya no sean necesarias. Esto garantiza que todos los registros de tareas en segundo plano estén actualizados cada vez que se inicie la aplicación.

Guía conceptual para multitarea en Windows 10

Guía de tareas en segundo plano relacionadas