Linee guida per le attività in background

Assicurarsi che l’app soddisfi i requisiti per l’esecuzione di attività in background.

Linee guida per attività in background

Quando si sviluppa l'attività in background e prima di pubblicare l'app, prendere in considerazione le indicazioni seguenti.

Se usi un'attività in background per riprodurre elementi multimediali in background, vedere Riprodurre elementi multimediali in background per informazioni sui miglioramenti apportati a Windows 10, versione 1607, che rendono ciò molto più semplice.

Attività in background in-process e out-of-process: Windows 10 versione 1607, introdotte attività in background in-process che consentono di eseguire codice in background nello stesso processo dell'app in primo piano. Quando si decide se avere attività in background in-process o out-of-process, tenere presenti i fattori seguenti:

Considerazione Impatto
Resilienza Se il processo in background è in esecuzione in un altro processo, un arresto anomalo del processo in background non arresterà l'applicazione in primo piano. Inoltre, l'attività in background può essere terminata, anche all'interno dell'app, se viene eseguito oltre i limiti di tempo di esecuzione. Separare il lavoro in background in un'attività separata dall'app in primo piano può essere una scelta migliore quando non è necessario che i processi in primo piano e in background comunichino tra loro (poiché uno dei principali vantaggi delle attività in background in-process è che eliminano la necessità di comunicazioni tra processi).
Semplicità Le attività in background in-process non richiedono la comunicazione tra processi e sono meno complesse da scrivere.
Trigger disponibili Le attività in background in-process non supportano i trigger seguenti: DeviceUseTrigger, DeviceServicingTrigger e IoTStartupTask.
VoIP Le attività in background in-process non supportano l'attivazione di un'attività in background VoIP all'interno dell'applicazione.

Limiti al numero di istanze di trigger: esistono limiti al numero di istanze di alcuni trigger che un'app può registrare. Un'app può registrare ApplicationTrigger, MediaProcessingTrigger e DeviceUseTrigger una sola volta per ogni istanza dell'app. Se un'app supera questo limite, la registrazione genera un'eccezione.

Quote CPU: le attività in background sono limitate dalla quantità di tempo di utilizzo dell'orologio reale che ottengono in base al tipo di trigger. La maggior parte dei trigger è limitata a 30 secondi di utilizzo del clock a muro, mentre alcuni hanno la possibilità di eseguire fino a 10 minuti per completare attività intensive. Le attività in background devono essere leggere per risparmiare durata della batteria e offrire un'esperienza utente migliore per le app in primo piano. Vedere Supportare l'app con le attività in background per i vincoli delle risorse applicati alle attività in background.

Gestire le attività in background: l'app dovrebbe ottenere un elenco di attività in background registrate, registrarsi per i gestori dello stato e del completamento e gestire tali eventi in modo appropriato. Le classi di attività in background devono segnalare lo stato di avanzamento, l'annullamento e il completamento. Per altre info, vedere Gestire un'attività in background annullata e Monitorare lo stato e il completamento dell'attività in background.

Usare BackgroundTaskDeferral: se la classe di attività in background esegue codice asincrono, assicurati di usare i differimenti. In caso contrario, l'attività in background potrebbe essere terminata prematuramente quando il metodo Run restituisce (o il metodo OnBackgroundActivated nel caso di attività in background in-process). Per maggiori informazioni, vedere Creare e registrare un'attività in background out-of-process.

In alternativa, richiedere un differire e usare async/await per completare le chiamate asincrone ai metodi. Chiudere il differire dopo le chiamate al metodo await.

Aggiornare il manifesto dell'app: per le attività in background che eseguono out-of-process, dichiarare ogni attività in background nel manifesto dell'applicazione, insieme al tipo di trigger con cui viene usato. In caso contrario, l'app non sarà in grado di registrare l'attività in background in fase di esecuzione.

Se sono presenti più attività in background, valutare se devono essere eseguite nello stesso processo host o separate in processi host diversi. Inserirli in processi host separati se si è preoccupati che un errore in un'attività in background potrebbe arrestare altre attività in background. Usare la voce Gruppo di risorse nella finestra di progettazione del manifesto per raggruppare le attività in background in processi host diversi.

Per impostare il Gruppo di risorse, aprire la finestra di progettazione Package.appxmanifest, scegliere Dichiarazioni e aggiungere una dichiarazione di Servizio app:

Impostazione del gruppo di risorse

Per altre informazioni sull'impostazione del gruppo di risorse, vedere le informazioni di riferimento sullo schema dell'applicazione.

Le attività in background eseguite nello stesso processo dell'app in primo piano non devono dichiararsi nel manifesto dell'applicazione. Per altre informazioni sulla dichiarazione di attività in background eseguite out-of-process nel manifesto, vedere Dichiarare le attività in background nel manifesto dell'applicazione.

Prepararsi per gli aggiornamenti delle app: se l'app verrà aggiornata, creare e registrare un'attività in background ServicingComplete (vedere SystemTriggerType) per annullare la registrazione delle attività in background per la versione precedente dell'app e registrar le attività in background per la nuova versione. Questo è anche un momento appropriato per eseguire gli aggiornamenti delle app che potrebbero essere necessari al di fuori del contesto di esecuzione in primo piano.

Richiesta di esecuzione di attività in background:

Importante A partire da Windows 10, le app non devono più trovarsi nella schermata di blocco come prerequisito per eseguire le attività in background.

Le app piattaforma UWP (Universal Windows Platform) possono eseguire tutti i tipi di attività supportati senza essere aggiunte alla schermata di blocco. Tuttavia, le app devono chiamare GetAccessState e verificare che l'app non venga negata per l'esecuzione in background. Assicurarsi che GetAccessStatus non restituisca una delle enumerazioni BackgroundAccessStatus negate. Ad esempio, questo metodo restituirà BackgroundAccessStatus.DeniedByUser se l'utente ha negato esplicitamente le autorizzazioni per le attività in background per l'app nelle impostazioni del dispositivo.

Se l'app viene negata l'esecuzione in background, l'app deve chiamare RequestAccessAsync e assicurarsi che la risposta non venga negata prima di registrare le attività in background.

Per altre informazioni sulla scelta dell'utente sull'attività in background e sul risparmio batteria, vedere Ottimizzare l'attività in background.

Elenco di spunta per le attività in background

Si applica alle attività in background in-process e out-of-process

  • Associare l'attività in background al trigger corretto.
  • Aggiungere condizioni per assicurarsi che l'attività in background venga eseguita correttamente.
  • Gestire lo stato di avanzamento, il completamento e la cancellazione delle attività in background.
  • Registrare nuovamente le attività in background durante l'avvio dell'app. In questo modo si garantisce che vengano registrati la prima volta che viene avviata l'app. Fornisce anche un modo per rilevare se l'utente ha disabilitato le funzionalità di esecuzione in background dell'app (nella registrazione degli eventi ha esito negativo).
  • Verificare la presenza di errori di registrazione delle attività in background. Se appropriato, provare a registrare nuovamente l'attività in background con valori di parametro diversi.
  • Per tutte le famiglie di dispositivi ad eccezione del desktop, se la memoria del dispositivo diventa insufficiente, le attività in background potrebbero essere terminate. Se non viene rilevata un'eccezione memoria insufficiente o l'app non la gestisce, l'attività in background verrà terminata senza avviso e senza generare l'evento OnCanceled. Ciò consente di garantire l'esperienza utente dell'app in primo piano. L'attività in background deve essere progettata per gestire questo scenario.

Si applica solo alle attività in background out-of-process

  • Creare l'attività in background in un componente Windows Runtime.
  • Non visualizzare l'interfaccia utente diversa da avvisi popup, riquadri e aggiornamenti badge dall'attività in background.
  • Nel metodo Run, richiedere rinvii per ogni chiamata asincrona al metodo e chiuderli al termine del metodo. In alternativa, usare un differitore con async/await.
  • Usare l'archiviazione permanente per condividere i dati tra l'attività in background e l'app.
  • Dichiarare ogni attività in background nel manifesto dell'applicazione, insieme al tipo di trigger con cui viene usata. Assicurarsi che i tipi di punto di ingresso e trigger siano corretti.
  • Non specificare un elemento Executable nel manifesto, a meno che non si usi un trigger che deve essere eseguito nello stesso contesto dell'app, ad esempio ControlChannelTrigger).

Si applica solo alle attività in background in-process

  • Quando si annulla un'attività, assicurarsi che il gestore eventi BackgroundActivated venga chiuso prima che si verifichi l'annullamento o che l'intero processo venga terminato.
  • Scrivere attività in background di breve durata. La maggior parte delle attività in background sono limitate a 30 secondi di utilizzo dell'orologio a parete.

Cose da evitare

  • Ridurre al minimo l'uso della comunicazione tra processi tramite COM o RPC.
  • Il processo con cui si sta tentando di comunicare potrebbe non trovarsi in uno stato di esecuzione che può comportare un blocco.
  • Una quantità significativa di tempo può essere impiegato per facilitare la comunicazione tra processi e verrà conteggiato rispetto al tempo assegnato per eseguire l'attività in background.
  • Non basarsi sull'interazione dell'utente nelle attività in background.