Eseguire un'attività in background mediante timer

Informazioni su come usare TimeTrigger per pianificare un'attività in background una tantum o eseguire un'attività periodica in background.

Vedere Scenario4 nell'esempio attivazione in background per vedere un esempio di come implementare l'attività in background attivata dall'ora descritta in questo argomento.

In questo argomento si presuppone che l'utente disponga di un'attività in background che deve essere eseguita periodicamente o in un momento specifico. Se non si dispone già di un'attività in background, è disponibile un'attività in background di esempio in BackgroundActivity.cs. In alternativa, seguire la procedura descritta in Creare e registrare un'attività in background in-process o Creare e registrare un'attività in background out-of-process per crearne una.

Creare un time trigger

Creare un nuovo TimeTrigger. Il secondo parametro, OneShot, specifica se l'attività in background verrà eseguita una sola volta o manterrà l'esecuzione periodica. Se OneShot è impostato su true, il primo parametro (FreshnessTime) specifica il numero di minuti di attesa prima di pianificare l'attività in background. Se OneShot è impostato su false, FreshnessTime specifica la frequenza con cui verrà eseguita l'attività in background.

Il timer predefinito per le app piattaforma UWP (Universal Windows Platform) (UWP) destinate alla famiglia di dispositivi mobili o desktop esegue attività in background a intervalli di 15 minuti. (Il timer viene eseguito in intervalli di 15 minuti, in modo che il sistema debba riattivarsi una sola volta ogni 15 minuti per riattivare le app che hanno richiesto TimerTriggers, che consente di risparmiare energia).

  • Se FreshnessTime è impostato su 15 minuti e OneShot è true, l'attività verrà pianificata per l'esecuzione una volta a partire da 15 a 30 minuti dal momento in cui viene registrata. Se è impostato su 25 minuti e OneShot è true, l'attività verrà pianificata per l'esecuzione una volta a partire da 25 a 40 minuti dal momento in cui viene registrata.

  • Se FreshnessTime è impostato su 15 minuti e OneShot è false, l'attività verrà pianificata per l'esecuzione ogni 15 minuti a partire da 15 a 30 minuti dal momento in cui viene registrata. Se è impostato su n minuti e OneShot è false, l'attività verrà pianificata per l'esecuzione ogni n minuti a partire da n e n + 15 minuti dopo la registrazione.

Nota

Se FreshnessTime è impostato a meno di 15 minuti, viene generata un'eccezione quando si tenta di registrare l'attività in background.

Ad esempio, questo trigger causerà l'esecuzione di un'attività in background una volta ogni ora.

TimeTrigger hourlyTrigger = new TimeTrigger(60, false);
Windows::ApplicationModel::Background::TimeTrigger hourlyTrigger{ 60, false };
TimeTrigger ^ hourlyTrigger = ref new TimeTrigger(60, false);

(Facoltativo) Aggiungere una condizione

È possibile creare una condizione dell'attività in background per controllare quando viene eseguita l'attività. Una condizione impedisce l'esecuzione dell'attività in background fino a quando non viene soddisfatta la condizione. Per altre informazioni, vedere Impostare le condizioni per l'esecuzione di un'attività in background.

In questo esempio la condizione è impostata su UserPresent in modo che, una volta attivata, l'attività venga eseguita solo una volta che l'utente è attivo. Per un elenco delle possibili condizioni, vedere SystemConditionType.

SystemCondition userCondition = new SystemCondition(SystemConditionType.UserPresent);
Windows::ApplicationModel::Background::SystemCondition userCondition{
    Windows::ApplicationModel::Background::SystemConditionType::UserPresent };
SystemCondition ^ userCondition = ref new SystemCondition(SystemConditionType::UserPresent);

Per informazioni più approfondite su condizioni e tipi di trigger in background, vedere Supportare l'app con le attività in background.

Call RequestAccessAsync()

Prima di registrare l'attività in background ApplicationTrigger, chiamare RequestAccessAsync per determinare il livello di attività in background consentito dall'utente perché l'utente potrebbe aver disattivato l'attività in background per l'app. Per maggiori informazioni sui modi in cui gli utenti possono controllare le impostazioni per l'attività in background, vedere Ottimizzare l'attività in background.

var requestStatus = await Windows.ApplicationModel.Background.BackgroundExecutionManager.RequestAccessAsync();
if (requestStatus != BackgroundAccessStatus.AlwaysAllowed)
{
    // Depending on the value of requestStatus, provide an appropriate response
    // such as notifying the user which functionality won't work as expected
}

Registrare l'attività in background

Registrare l'attività in background richiamando la funzione di registrazione dell'attività in background. Per altre informazioni sulla registrazione delle attività in background e per visualizzare la definizione del metodo RegisterBackgroundTask() nel codice di esempio seguente, vedere Registrare un'attività in background.

Importante

Per le attività in background eseguite nello stesso processo dell'app, non impostare entryPoint. Per le attività in background eseguite in un processo separato dall'app, impostare entryPoint come spazio dei nomi '.' e il nome della classe che contiene l'implementazione dell'attività in background.

string entryPoint = "Tasks.ExampleBackgroundTaskClass";
string taskName   = "Example hourly background task";

BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);
std::wstring entryPoint{ L"Tasks.ExampleBackgroundTaskClass" };
std::wstring taskName{ L"Example hourly background task" };

Windows::ApplicationModel::Background::BackgroundTaskRegistration task{
    RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition) };
String ^ entryPoint = "Tasks.ExampleBackgroundTaskClass";
String ^ taskName   = "Example hourly background task";

BackgroundTaskRegistration ^ task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);

I parametri di registrazione delle attività in background vengono convalidati al momento della registrazione. Se uno dei parametri di registrazione non è valido, viene restituito un errore. Assicurarsi che l'app gestisca correttamente gli scenari in cui la registrazione delle attività in background ha esito negativo. Se invece l'app dipende dalla presenza di un oggetto di registrazione valido dopo il tentativo di registrazione di un'attività, potrebbe verificarsi un arresto anomalo.

Gestire le risorse per l'attività in background

Usare BackgroundExecutionManager.RequestAccessAsync per determinare se l'utente ha deciso che l'attività in background dell'app deve essere limitata. Tenere presente l'utilizzo della batteria ed eseguire in background solo quando è necessario completare un'azione desiderata dall'utente. Per maggiori informazioni sui modi in cui gli utenti possono controllare le impostazioni per l'attività in background, vedere Ottimizzare l'attività in background.

  • Memoria: l'ottimizzazione della memoria e dell'utilizzo energetico dell'app sono fondamentali per garantire che il sistema operativo consentirà l'esecuzione dell'attività in background. Usare le API gestione della memoria per verificare la quantità di memoria usata dall'attività in background. Maggiore è la quantità di memoria usata dall'attività in background, più è difficile che il sistema operativo la mantenga in esecuzione quando un'altra app è in primo piano. L'utente ha in definitiva il controllo di tutte le attività in background che l'app può eseguire e ha visibilità sull'impatto che l'app ha sull'uso della batteria.
  • Tempo CPU: le attività in background sono limitate dalla quantità di tempo di utilizzo dell'orologio reale che ottengono in base al tipo di trigger.

Vedere Supportare l'app con le attività in background per i vincoli delle risorse applicati alle attività in background.

Osservazioni:

A partire da Windows 10, non è più necessario che l'utente aggiunga l'app alla schermata di blocco per usare le attività in background.

Un'attività in background viene eseguita solo usando un TimeTrigger se prima è stato chiamato RequestAccessAsync.