Idioma: HTML | XAML

Inicio rápido: Crear y registrar una tarea en segundo plano (XAML)

Crea una tarea en segundo plano y regístrala para ejecutarla, y que proporcione funciones cuando tu aplicación no esté en primer plano.

Requisitos previos

  • La aplicación necesita trabajar en segundo plano y este trabajo no puede hacerse a través de ninguna otra funcionalidad en segundo plano proporcionada por la plataforma.

Crear la clase de tareas en segundo plano

Puedes ejecutar código en segundo plano al escribir clases que implementen la interfaz IBackgroundTask. Este código se ejecutará cuando se desencadena un evento específico usando, por ejemplo, SystemTrigger o MaintenanceTrigger.

En estos pasos te mostramos cómo escribir una nueva clase que implemente la interfaz IBackgroundTask. Antes de comenzar, crea un nuevo proyecto en tu solución para tareas en segundo plano. Agrega una clase vacía para tu tarea en segundo plano e importa el espacio de nombres Windows.ApplicationModel.Background.

  1. Crea un nuevo proyecto para tareas en segundo plano y agrégalo a tu solución. Para hacerlo, haz clic con el botón derecho en tu solución y selecciona Agregar->Nuevo proyecto. Después, selecciona el tipo de proyecto Componente de Windows en tiempo de ejecución, asigna un nombre al proyecto y haz clic en Aceptar.
  2. Haz referencia al proyecto de tareas en segundo plano desde tu proyecto de aplicación de la Tienda Windows o de aplicación de Windows Phone.

    Para una aplicación C++, haz clic con el botón derecho en el proyecto de tu aplicación y selecciona Propiedades. Luego, ve a Propiedades comunes y haz clic en Agregar nueva referencia, activa la casilla que se encuentra junto a tu proyecto de tareas en segundo plano y haz clic en Aceptar en los dos cuadros de diálogo.

    Para una aplicación C#, en tu proyecto de aplicación, haz clic con el botón derecho en Referencias y selecciona Agregar nueva referencia. En Solución, selecciona Proyectos, selecciona el nombre de tu proyecto de tarea en segundo plano y haz clic en Aceptar.

  3. Crea una nueva clase que implemente la interfaz IBackgroundTask. El método Run es un punto de entrada necesario al que se llamará cuando se desencadene el evento especificado; este método es necesario en todas las tareas en segundo plano.

    Nota  La propia clase de tareas en segundo plano (y todas las demás clases en el proyecto de tareas en segundo plano) debe ser una clase public que sea sealed.

    El siguiente código de ejemplo muestra un punto de inicio muy básico para una clase de tarea en segundo plano:

    
    
    //
    // ExampleBackgroundTask.cs
    //
    
    using Windows.ApplicationModel.Background;
    
    namespace Tasks
    {
        public sealed class ExampleBackgroundTask : IBackgroundTask
        {
            public void Run(IBackgroundTaskInstance taskInstance)
            {
                
            }        
        }
    }
    
    
    
    //
    // ExampleBackgroundTask.h
    //
    
    #pragma once
    
    using namespace Windows::ApplicationModel::Background;
    
    namespace Tasks
    {
        public ref class ExampleBackgroundTask sealed : public IBackgroundTask
        {
    
        public:
            ExampleBackgroundTask();
    
            virtual void Run(IBackgroundTaskInstance^ taskInstance);
            void OnCompleted(
                    BackgroundTaskRegistration^ task,
                    BackgroundTaskCompletedEventArgs^ args
                    );
        };
    }
    
    
  4. Si ejecutas algún código asincrónico en tu tarea en segundo plano, entonces esta necesita usar un aplazamiento. Si no, el proceso de la tarea en segundo plano puede terminar de forma inesperada si el método Run finaliza antes de que lo haga la llamada a tu método asincrónico.

    Solicita el aplazamiento en el método Run antes de llamar al método asincrónico. Guarda el aplazamiento en una variable global de forma que se pueda acceder a él desde el método asincrónico. Declara el aplazamiento completo después de que se complete el código asincrónico.

    El siguiente código de ejemplo obtiene el aplazamiento, lo guarda y lo libera cuando se completa el código asincrónico:

    
    
    public async void Run(IBackgroundTaskInstance taskInstance)
    {
        BackgroundTaskDeferral _deferral = taskInstance.GetDeferral();
        
        //
        // TODO: Insert code to start one or more asynchronous methods using the
        //       await keyword, for example:
        //
        // await ExampleMethodAsync();
        //
        
        _deferral.Complete();
    }
    
    
    Nota  En C#, se puede llamar a los métodos asincrónicos de tu tarea en segundo plano usando las palabras clave async/await. En C++, se puede lograr un resultado similar con una cadena de tareas.

    Para más información acerca de modelos asincrónicos, consulta el tema sobre la Programación asincrónica. Para obtener otros ejemplos sobre cómo usar aplazamientos para evitar que una tarea en segundo plano termine antes de tiempo, consulta la muestra de tarea en segundo plano.

Los siguientes pasos se completan en una de tus clases de aplicaciones (por ejemplo, MainPage.xaml.cs).

Nota  También puedes crear una función dedicada para registrar tareas en segundo plano; consulta Cómo registrar una tarea en segundo plano. En ese caso, en lugar de usar los siguientes 3 pasos, simplemente puedes construir el desencadenador y proporcionar la función de registro junto con el nombre de la tarea, el punto de entrada de la tarea y (de forma opcional) una condición.

Registrar la tarea en segundo plano por ejecutar

  1. Averigua si la tarea en segundo plano ya está registrada al iterar en la propiedad BackgroundTaskRegistration.AllTasks. Este paso es importante; si tu aplicación no comprueba los registros de tareas en segundo plano existentes, fácilmente podría registrar una tarea varias veces. Esto causaría problemas de rendimiento y consumiría el tiempo de CPU disponible para la tarea antes de que su trabajo pueda completarse.

    El siguiente ejemplo itera en la propiedad AllTasks y establece una variable de marca en true, si la tarea ya está registrada:

    
    var taskRegistered = false;
    var exampleTaskName = "ExampleBackgroundTask";
    
    foreach (var task in Background.BackgroundTaskRegistration.AllTasks)
    {
        if (task.Value.Name == exampleTaskName)
        {
            taskRegistered = true;
            break;
        }
    }
    
    
  2. Si aún no está registrada, usa BackgroundTaskBuilder para crear una instancia de la tarea en segundo plano. El punto de entrada de la tarea debe ser el nombre de tu clase de tarea en segundo plano con el espacio de nombres como prefijo.

    El desencadenador de tarea en segundo plano controla cuándo se ejecutará la tarea en segundo plano. Para obtener una lista de posibles desencadenadores, consulta SystemTrigger.

    Por ejemplo, este código crea una nueva tarea en segundo plano y establece que se ejecute cuando el desencadenador TimeZoneChanged se activa:

    
    
    var builder = new BackgroundTaskBuilder();
    
    builder.Name = exampleTaskName;
    builder.TaskEntryPoint = "Tasks.ExampleBackgroundTask";
    builder.SetTrigger(new SystemTrigger(SystemTriggerType.TimeZoneChange, false));
    
    
  3. Puedes agregar una condición para controlar si la tarea se ejecutará después de que se produzca el evento del desencadenador (opcional). Por ejemplo, si solo deseas que la tarea se ejecute cuando el usuario esté presente, usa la condición UserPresent. Para obtener una lista de posibles condiciones, consulta SystemConditionType.

    El siguiente código de muestra asigna una condición que requiere que el usuario esté presente:

    
    builder.AddCondition(new SystemCondition(SystemConditionType.UserPresent));
    
    
  4. Registra la tarea en segundo plano llamando al método Register en el objeto BackgroundTaskBuilder. Almacena el resultado BackgroundTaskRegistration, para poder usarlo en el próximo paso.

    El siguiente código registra la tarea en segundo plano y almacena el resultado:

    
    BackgroundTaskRegistration task = builder.Register();
    
    

    Nota  

    En las aplicaciones de la Tienda de Windows Phone, debes llamar a RequestAccessAsync antes de intentar registrar cualquier tarea en segundo plano. En Windows, esta llamada solo es necesaria para el conjunto de tareas en segundo plano que requieren que tu aplicación esté en la pantalla de bloqueo para ejecutarse, pero en el teléfono debes llamar a este método una vez antes de registrar cualquier tarea en segundo plano.

    Para garantizar que la aplicación de la Tienda de Windows Phone continúe funcionando correctamente después de publicar una actualización, se debe llamar a RemoveAccess y luego a RequestAccessAsync cuando se inicia la aplicación tras su actualización. Para obtener más información, consulta Directrices para tareas en segundo plano (aplicaciones de Windows en tiempo de ejecución).

    Nota  

    A partir de Windows 8.1, los parámetros de registro de tareas en segundo plano se validan en el momento de realizar el registro. Se devuelve un error si cualquiera de los parámetros de registro no es válido. La aplicación debe poder enfrentarse a los escenarios en que se produce un error en el registro de tareas en segundo plano. Por ejemplo, usa una instrucción condicional para comprobar si hay errores de registro y después vuelve a probar el registro con errores con valores de parámetros diferentes.

Administrar la finalización de tareas en segundo plano mediante controladores de evento

Deberías registrar un método con el BackgroundTaskCompletedEventHandler, de manera que tu aplicación pueda obtener resultados de la tarea en segundo plano. Cuando se lanza o reanuda la aplicación, se llamará al método OnCompleted si la tarea en segundo plano se ha completado desde la última vez que la aplicación estuvo en primer plano. (Se llamará de forma inmediata al método OnCompleted si la tarea en segundo plano se completa mientras tu aplicación se encuentra actualmente en primer plano).

  1. Escribe un método OnCompleted para administrar la finalización de tareas en segundo plano. Por ejemplo, el resultado de la tarea en segundo plano podría provocar una actualización de la interfaz de usuario. La superficie del método que se muestra aquí es necesario para el método del controlador de eventos OnCompleted, incluso aunque este ejemplo no usa el parámetro args.

    El siguiente ejemplo de código reconoce la finalización de la tarea en segundo plano y llama a un método de ejemplo de actualización de la interfaz de usuario que toma una cadena de mensaje.

    
    
    private void OnCompleted(IBackgroundTaskRegistration task, BackgroundTaskCompletedEventArgs args)
    {
        var settings = ApplicationData.Current.LocalSettings;
        var key = task.TaskId.ToString();
        var message = settings.Values[key].ToString();
        UpdateUIExampleMethod(message);
    }
    
    
    Nota  Las actualizaciones de la interfaz de usuario se deberían realizar de forma asincrónica, para evitar retener el subproceso de interfaz de usuario. Para ver un ejemplo, consulta el método UpdateUI en la muestra de tarea en segundo plano.
  2. Vuelve al punto en el que registraste la tarea en segundo plano. Debajo de esa línea de código, agrega un nuevo objeto BackgroundTaskCompletedEventHandler. Proporciona tu métoco OnCompleted como el parámetro para el constructor BackgroundTaskCompletedEventHandler.

    El siguiente ejemplo de código agrega un BackgroundTaskCompletedEventHandler al BackgroundTaskRegistration:

    
    
    task.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted);
    
    

Declarar que tu aplicación usa tareas en segundo plano en el manifiesto de la aplicación

Antes de que tu aplicación pueda ejecutar tareas en segundo plano, debes declarar cada una de ellas en el manifiesto de la aplicación.

  • Abre el manifiesto de la aplicación (el archivo llamado "package.appmanifest") y ve al elemento Extensions. Agrega un elemento Extension, con la categoría establecida en "windows.backgroundTasks", para todas las clases de tareas en segundo plano usadas en tu aplicación.

    Debes listar todos los tipos de desencadenador usados con tu tarea en segundo plano. Si tu aplicación trata de registrar una tarea en segundo plano con un desencadenador que no esté en la lista del manifiesto, no se podrá realizar el registro.

    El siguiente elemento Extensions de ejemplo registra la tarea en segundo plano creada en este tema:

    
    
    <Extensions>
      <Extension Category="windows.backgroundTasks" EntryPoint="Tasks.ExampleBackgroundTask">
        <BackgroundTasks>
          <Task Type="systemEvent" />
        </BackgroundTasks>
      </Extension>
    </Extensions>
    
    

Resumen

Ahora deberías conocer los conceptos básicos de cómo escribir una clase de tareas en segundo plano, cómo registrar la tarea en segundo plano desde dentro de tu aplicación y cómo hacer que tu aplicación reconozca cuándo se ha completado la tarea en segundo plano. También debes comprender cómo actualizar el manifiesto de la aplicación para que Windows 8 permita que tu aplicación registre la tarea en segundo plano.

Nota  Descarga la muestra de tarea en segundo plano para ver ejemplos de código similares en el contexto de una aplicación de la Tienda Windows sólida y completa que utiliza tareas en segundo plano.

Consulta los siguientes temas relacionados para obtener referencia de las API, guía conceptual sobre tareas en segundo plano e instrucciones más detalladas para escribir aplicaciones que usan tareas en segundo plano.

Temas relacionados

Temas con instrucciones detalladas sobre las tareas en segundo plano
Cómo responder a eventos del sistema con tareas en segundo plano
Cómo registrar una tarea en segundo plano
Cómo establecer condiciones para ejecutar una tarea en segundo plano
Cómo usar desencadenadores de mantenimiento
Cómo administrar una tarea en segundo plano cancelada
Cómo supervisar el progreso y la finalización de tareas en segundo plano
Cómo ejecutar una tarea en segundo plano en un temporizador
Guía de tareas en segundo plano
Directrices y listas de comprobación para tareas en segundo plano
How to debug a background task
Cómo desencadenar los eventos suspender, reanudar y en segundo plano en aplicaciones de la Tienda Windows (al depurar)
Referencia de API de tareas en segundo plano
Windows.ApplicationModel.Background

 

 

Mostrar:
© 2015 Microsoft