Riprodurre elementi multimediali in background

Questo articolo illustra come configurare l'app in modo che i supporti continuino a essere riprodotti quando l'app passa dal primo piano allo sfondo. Ciò significa che anche dopo che l'utente ha ridotto l'app a icona, è tornato alla schermata iniziale o si è allontanato dall'app in altro modo, l'app può continuare a riprodurre audio.

Gli scenari per la riproduzione audio in background includono:

  • Playlist a esecuzione prolungata: l'utente visualizza brevemente un'app in primo piano per selezionare e avviare una playlist, dopo la quale l'utente si aspetta che la playlist continui a essere riprodotta in background.

  • Uso del commutatore di attività: l'utente visualizza brevemente un'app in primo piano per avviare la riproduzione dell'audio, quindi passa a un'altra app aperta usando il commutatore di attività. L'utente prevede che l'audio continui a essere riprodotto in background.

L'implementazione dell'audio in background descritta in questo articolo consentirà all'app di essere eseguita universalmente in tutti i dispositivi Windows, tra cui Dispositivi mobili, Desktop e Xbox.

Nota

Il codice in questo articolo è stato adattato dall'esempio di audio in background UWP.

Spiegazione del modello un processo

Con Windows 10, versione 1607, è stato introdotto un nuovo modello a processo singolo che semplifica notevolmente il processo di abilitazione dell'audio in background. In precedenza, l'app era necessaria per gestire un processo in background oltre all'app in primo piano e quindi comunicare manualmente le modifiche dello stato tra i due processi. Con il nuovo modello, aggiungere semplicemente la funzionalità audio in background al manifesto dell'app e l'app continuerà automaticamente a riprodurre l'audio quando passa allo sfondo. Due nuovi eventi del ciclo di vita dell'applicazione, EnteredBackground e LeavingBackground comunicano all'app quando entra e lascia lo sfondo. Quando l'app passa alle transizioni da o verso lo sfondo, i vincoli di memoria applicati dal sistema possono cambiare, in modo da poter usare questi eventi per controllare il consumo di memoria corrente e liberare risorse per rimanere al di sotto del limite.

Eliminando la complessa comunicazione tra processi e la gestione dello stato, il nuovo modello consente di implementare l'audio in background molto più rapidamente con una riduzione significativa del codice. Tuttavia, il modello a due processi è ancora supportato nella versione corrente per la compatibilità con le versioni precedenti. Per altre informazioni, vedere Modello audio in background legacy.

Requisiti per l'audio in background

L'app deve soddisfare i requisiti seguenti per la riproduzione audio mentre l'app è in background.

  • Aggiungere la funzionalità Riproduzione multimediale in background al manifesto dell'app, come descritto più avanti in questo articolo.
  • Se l'app disabilita l'integrazione automatica di MediaPlayer con i controlli SMTC (System Media Transport Controls), ad esempio impostando la proprietà CommandManager.IsEnabled su false, devi implementare l'integrazione manuale con i controlli SMTC per abilitare la riproduzione multimediale in background. Si deve anche integrare manualmente con SMTC se usi un'API diversa da MediaPlayer, come AudioGraph, per riprodurre audio se si vuole che l'audio continui a essere riprodotto quando l'app passa allo sfondo. I requisiti minimi di integrazione SMTC sono descritti nella sezione "Utilizzare i controlli di trasporto multimediale di sistema per l'audio in background" di Controllo manuale dei controlli di trasporto multimediale di sistema.
  • Mentre l'app è in background, si deve rimanere al di sotto dei limiti di utilizzo della memoria impostati dal sistema per le app in background. Le linee guida per la gestione della memoria in background sono disponibili più avanti in questo articolo.

Funzionalità del manifesto della riproduzione multimediale in background

Per abilitare l'audio in background, si deve aggiungere la funzionalità di riproduzione multimediale in background al file manifesto dell'app Package.appxmanifest.

Per aggiungere funzionalità al manifesto dell'app tramite la finestra di progettazione del manifesto

  1. In Esplora soluzioni in Microsoft Visual Studio aprire la finestra di progettazione per il manifesto dell'applicazione facendo doppio clic sull'elemento package.appxmanifest.
  2. Fare clic sulla scheda Funzionalità.
  3. Selezionare la casella di spunta Riproduzione multimediale in background.

Per impostare la funzionalità modificando manualmente il file XML del manifesto dell'app, assicurarsi prima di tutto che il prefisso dello spazio dei nomi uap3 sia definito nell'elemento Package. In caso contrario, aggiungerlo come illustrato di seguito.

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
  IgnorableNamespaces="uap uap3 mp">

Aggiungere quindi la funzionalità fackgroundMediaPlayback all'elemento Capabilities:

<Capabilities>
    <uap3:Capability Name="backgroundMediaPlayback"/>
</Capabilities>

Gestire la transizione tra primo piano e sfondo

Quando l'app passa dal primo piano allo sfondo, viene generato l'evento EnteredBackground. E quando l'app torna in primo piano, viene generato l'evento LeavingBackground. Poiché si tratta di eventi del ciclo di vita dell'app, si devono registrare i gestori per questi eventi quando viene creata l'app. Nel modello di progetto predefinito questo significa aggiungerlo al costruttore della classe App in App.xaml.cs.

public App()
{
    this.InitializeComponent();
    this.Suspending += OnSuspending;

    this.EnteredBackground += App_EnteredBackground;
    this.LeavingBackground += App_LeavingBackground;
}

Creare una variabile per tenere traccia dell'esecuzione in background.

bool _isInBackgroundMode = false;

Quando viene generato l'evento EnteredBackground, impostare la variabile di rilevamento per indicare che è attualmente in esecuzione in background. Non è consigliabile eseguire attività a esecuzione prolungata nell'evento EnteredBackground perché ciò potrebbe causare la lentezza della transizione allo sfondo per l'utente.

private void App_EnteredBackground(object sender, EnteredBackgroundEventArgs e)
{
    _isInBackgroundMode = true;
}

Nel gestore eventi LeavingBackground si deve impostare la variabile di rilevamento per indicare che l'app non è più in esecuzione in background.

private void App_LeavingBackground(object sender, LeavingBackgroundEventArgs e)
{
    _isInBackgroundMode = false;
}

Requisiti di gestione della memoria

La parte più importante della gestione della transizione tra primo piano e background consiste nella gestione della memoria usata dall'app. Poiché l'esecuzione in background riduce le risorse di memoria che l'app può conservare dal sistema, devi registrarti anche per gli eventi AppMemoryUsageIncreased e AppMemoryUsageLimitChanging. Quando questi eventi vengono generati, è necessario controllare l'utilizzo corrente della memoria dell'app e il limite corrente e quindi ridurre l'utilizzo della memoria, se necessario. Per informazioni sulla riduzione dell'utilizzo della memoria durante l'esecuzione in background, vedere Liberare memoria quando l'app passa in background.

Disponibilità di rete per le app multimediali in background

Tutte le origini multimediali con riconoscimento della rete, quelle che non vengono create da un flusso o da un file, mantengono attiva la connessione di rete durante il recupero del contenuto remoto e la rilasciano quando non lo sono. MediaStreamSource, in particolare, si basa sull'applicazione per segnalare correttamente l'intervallo memorizzato nel buffer corretto alla piattaforma usando SetBufferedRange. Dopo che l'intero contenuto è completamente memorizzato nel buffer, la rete non sarà più riservata per conto dell'app.

Se è necessario effettuare chiamate di rete che si verificano in background quando il supporto non viene scaricato, è necessario eseguirne il wrapping in un'attività appropriata, ad esempio MaintenanceTrigger o TimeTrigger. Per maggiori informazioni, vedere Supportare l'app con attività in background.