Linguaggio: HTML | XAML

Guida introduttiva: Creare e registrare un'attività in background (XAML)

Applies to Windows and Windows Phone

Crea una classe di attività in background e registrala per l'esecuzione, in modo che garantisca le funzionalità quando l'app non è in primo piano.

Prerequisiti

  • L'app deve eseguire operazioni in background che non possono essere eseguite da nessun'altra funzionalità in background fornita dalla piattaforma.

Creare la classe di attività in background

Per eseguire codice in background puoi scrivere classi che implementino l'interfaccia IBackgroundTask. Questo codice viene eseguito quando si attiva un determinato evento con SystemTrigger, ad esempio, o MaintenanceTrigger.

I passaggi seguenti illustrano come scrivere una nuova classe che implementa l'interfaccia IBackgroundTask. Prima di iniziare, crea un nuovo progetto nella tua soluzione per le attività in background. Aggiungi una nuova classe vuota per le tue attività in background e importa lo spazio dei nomi Windows.ApplicationModel.Background.

  1. Crea un nuovo progetto per le attività in background e aggiungilo alla tua soluzione. A tale scopo, fai clic con il pulsante destro del mouse sulla tua soluzione e scegli Aggiungi->Nuovo progetto. Quindi seleziona il tipo di progetto Componente Windows Runtime, assegna un nome al progetto e fai clic su OK.
  2. Fai riferimento al progetto di attività in background dal tuo progetto di app per Windows Store o Windows Phone.

    Per un' app in C++, fai clic con il pulsante destro del mouse sul progetto dell'app e scegli Proprietà. Quindi passa a Proprietà comuni e fai clic su Aggiungi nuovo riferimento, seleziona la casella di controllo accanto al tuo progetto di attività in background e fai clic su OK in entrambe le finestre di dialogo.

    Per un'app in C#, nel tuo progetto di app fai clic con il pulsante destro del mouse su Riferimenti e scegli Aggiungi nuovo riferimento. In Soluzione, seleziona Progetti, quindi seleziona il nome del progetto di attività in background e fai clic su OK.

  3. Crea una nuova classe che implementa l'interfaccia IBackgroundTask. Il metodo Run è un punto di ingresso obbligatorio che verrà chiamato quando verrà attivato l'evento specificato. Questo metodo è obbligatorio in ogni attività in background.

    Nota  La classe delle attività in background e tutte le altre classi nel progetto di attività in background devono essere classi public e sealed.

    L'esempio di codice seguente rappresenta un punto di partenza molto di base per una classe di attività in background:

    
    
    //
    // 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. Se esegui del codice asincrono nell'attività in background, tale attività dovrà usare un differimento. Se non usi un differimento e il metodo Run viene completato prima del tuo metodo asincrono, il processo dell'attività in background può terminare in modo imprevisto.

    Richiedi il differimento nel metodo Run prima di chiamare il metodo asincrono. Salva il differimento in una variabile globale per renderla accessibile dal metodo asincrono. Dichiara il differimento completato dopo il completamento del codice asincrono.

    Il codice di esempio seguente ottiene il differimento, lo salva e lo rilascia quando il codice asincrono è completato:

    
    
    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  In C# i metodi asincroni dell'attività in background possono essere chiamati con le parole chiave async/await. In C++ un risultato analogo può essere ottenuto con una catena di attività.

    Per altre informazioni sui modelli asincroni, vedi Programmazione asincrona. Per altri esempi di uso dei differimenti per impedire che un'attività in background termini prima del previsto, vedi l'esempio di attività in background.

I passaggi seguenti vengono completati un una delle classi dell'app, ad esempio MainPage.xaml.cs.

Nota  Puoi anche creare una funzione dedicata alla registrazione di attività in background (vedi Come registrare un'attività in background). In tal caso, anziché usare i prossimi 3 passaggi, puoi semplicemente creare il trigger e fornirlo alla funzione di registrazione insieme al nome dell'attività, al punto di ingresso e a una condizione (facoltativa).

Registrare l'attività in background per l'esecuzione

  1. Verifica se l'attività in background è già stata registrata eseguendo un'iterazione tramite la proprietà BackgroundTaskRegistration.AllTasks. Questo passaggio è importante poiché, se l'app non verifica la presenza di registrazioni esistenti dell'attività in background, può registrarla più volte, causando problemi di prestazioni ed esaurendo il tempo CPU disponibile per l'attività prima che possa essere completata.

    L'esempio seguente illustra l'iterazione della proprietà AllTasks e imposta una variabile flag su true se l'attività è già registrata:

    
    var taskRegistered = false;
    var exampleTaskName = "ExampleBackgroundTask";
    
    foreach (var task in Background.BackgroundTaskRegistration.AllTasks)
    {
        if (task.Value.Name == exampleTaskName)
        {
            taskRegistered = true;
            break;
        }
    }
    
    
  2. Se attività in background non è stata registrata, usa BackgroundTaskBuilder per creare un'istanza dell'attività in background. Il punto di ingresso dell'attività deve essere il nome della classe dell'attività in background preceduto dallo spazio dei nomi.

    Il trigger dell'attività in background determina quando essa viene eseguita. Per l'elenco dei possibili trigger, vedi SystemTrigger.

    Ad esempio, questo codice crea una nuova attività in background e la imposta in modo che venga eseguita quando il trigger TimeZoneChanged viene attivato:

    
    
    var builder = new BackgroundTaskBuilder();
    
    builder.Name = exampleTaskName;
    builder.TaskEntryPoint = "Tasks.ExampleBackgroundTask";
    builder.SetTrigger(new SystemTrigger(SystemTriggerType.TimeZoneChange, false));
    
    
  3. Puoi aggiungere una condizione per determinare quando eseguire l'attività dopo che si verifica l'evento del trigger (facoltativo). Ad esempio, se non vuoi che l'attività venga eseguita finché l'utente è presente, usa la condizione UserPresent. Per l'elenco delle possibili condizioni, vedi SystemConditionType.

    Il codice di esempio seguente assegna una condizione che richiede la presenza dell'utente:

    
    builder.AddCondition(new SystemCondition(SystemConditionType.UserPresent));
    
    
  4. Registra l'attività in background chiamando il metodo Register sull'oggetto BackgroundTaskBuilder. Archivia il risultato BackgroundTaskRegistration in modo da poterlo riutilizzare nel passaggio successivo.

    Il codice seguente consente di registrare l'attività in background e di archiviare il risultato:

    
    BackgroundTaskRegistration task = builder.Register();
    
    
    • Applies to Windows Phone

    In Windows Phone devi chiamare RequestAccessAsync prima di tentare di registrare attività in background. In Windows la chiamata è necessaria solo per il set di attività in background per la cui esecuzione l'app deve essere nella schermata di blocco. Nel telefono devi tuttavia chiamare il metodo una volta prima di registrare attività in background.

    Nota  

    A partire da Windows 8.1, i parametri di registrazione dell'attività in background vengono convalidati al momento della registrazione. Se uno dei parametri di registrazione non è valido, viene restituito un errore. L'app deve essere in grado di gestire scenari in cui si verifica un errore di registrazione dell'attività in background. Puoi ad esempio usare un'istruzione condizionale per controllare la presenza di errori di registrazione e quindi eseguire un nuovo tentativo in caso di errore della registrazione usando valori dei parametri diversi.

Gestire il completamento delle attività in background con i gestori di eventi

Ti consigliamo di registrare un metodo con BackgroundTaskCompletedEventHandler per dare modo alla tua app di ottenere risultati dall'attività in background. Quando si avvia o si riprende l'esecuzione dell'app, viene chiamato il metodo OnCompleted se l'attività in background è stata completata dall'ultima volta che l'app si trovava in primo piano. Il metodo OnCompleted viene chiamato immediatamente se l'attività in background viene completata mentre l'app si trova in primo piano.

  1. Scrivi un metodo OnCompleted che gestisca il completamento delle attività in background. Ad esempio, il risultato dell'attività in background può causare l'aggiornamento dell'interfaccia utente. Il footprint del metodo qui illustrato è necessario per il metodo del gestore di eventi OnCompleted, anche se questo esempio non utilizza il parametro args.

    L'esempio di codice seguente riconosce il completamento dell'attività in background e chiama un metodo di aggiornamento dell'interfaccia utente di esempio che accetta una stringa del messaggio.

    
    
    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  Gli aggiornamenti all'interfaccia utente devono essere eseguiti in modo asincrono, per non ritardare il thread dell'interfaccia utente. Per un esempio, vedi il metodo UpdateUI nell'esempio di attività in background.

  2. Torna al punto in cui hai registrato l'attività in background. Dopo quella riga di codice, aggiungi un nuovo oggetto BackgroundTaskCompletedEventHandler. Indica il metodo OnCompleted come parametro del costruttore BackgroundTaskCompletedEventHandler.

    L'esempio di codice seguente aggiunge un BackgroundTaskCompletedEventHandler a BackgroundTaskRegistration:

    
    
    task.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted);
    
    

Dichiarare che l'app usa attività in background nel manifesto dell'app

Prima di poter eseguire le attività in background, devi dichiarare ogni attività in background nel manifesto dell'app.

  • Apri il manifesto dell'app, vale a dire il file denominato "package.appmanifest", e passa all'elemento Extension. Aggiungi un elemento Extension impostando la categoria su "windows.backgroundTasks" per ogni classe di attività in background utilizzata nell'app.

    Devi elencare tutti i tipi di trigger utilizzati con l'attività in background. Se l'app tenta di registrare un'attività in background con un trigger non elencato nel manifesto, la registrazione non riesce.

    L'esempio di elemento Extension seguente registra l'attività in background creata in questo argomento:

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

Riepilogo

A questo punto dovresti esserti fatto un'idea di come scrivere una classe di attività in background, registrare l'attività in background dall'interno dell'app e fare in modo che l'app riconosca quando l'attività in background è stata completata. Dovresti anche essere in grado di aggiornare il manifesto dell'applicazione affinché Windows 8 consenta all'app di registrare l'attività in background.

Nota  Scarica l'esempio di attività in background per vedere esempi di codice simili nel contesto di un'app di Windows Store solida e completa che usa attività in background.

Per informazioni di riferimento sulle API, indicazioni concettuali sulle attività in background e istruzioni più dettagliate sulla scrittura di app che usano attività in background, vedi i seguenti argomenti correlati.

Argomenti correlati

Argomenti contenenti istruzioni dettagliate sulle attività in background
Come rispondere agli eventi di sistema con le attività in background
Come registrare un'attività in background
Come impostare le condizioni per un'attività in background
Come usare i trigger di manutenzione
Come gestire un'attività in background annullata
Come monitorare l'avanzamento e il completamento delle attività in background
Come eseguire un'attività in background mediante timer
Indicazioni sulle attività in background
Linee guida ed elenco di controllo per le attività in background
How to debug a background task
Come attivare eventi di sospensione e ripresa ed eventi in background nelle app di Windows Store (durante il debug)
Informazioni di riferimento sulle API delle attività in background
Windows.ApplicationModel.Background

 

 

Mostra:
© 2014 Microsoft