Panoramica: audio in background (app di Windows Phone Store) (HTML)
[ Questo articolo è rivolto agli sviluppatori per Windows 8.x e Windows Phone 8.x che realizzano app di Windows Runtime. Gli sviluppatori che usano Windows 10 possono vedere Documentazione aggiornata ]
Puoi scrivere app per Windows Phone 8.1 che riproducono audio in background. Questo significa che la tua app può continuare a riprodurre audio anche quando l'utente ne esce premendo il pulsante Indietro o il pulsante Start. In questo articolo vengono presentati i componenti di un'app per audio in background e le relative interazioni.
Ecco alcuni esempi di scenari per la riproduzione di audio in background:
- Playlist di lunga durata L'utente porta brevemente in primo piano un'app per selezionare e avviare una playlist e quindi si aspetta che la riproduzione della playlist continui in background.
- Cambio attività L'utente porta brevemente in primo piano un'app per avviare la riproduzione di audio, quindi passa a un'altra app aperta cambiando attività e si aspetta che la riproduzione dell'audio continui in background.
Suggerimento Puoi scaricare il codice per l'esempio di audio in background per Windows Phone 8.1 che implementa il codice illustrato in questa panoramica.
Architettura dell'audio in background
Un'app per audio in background audio usa agenti in background. La riproduzione di audio in background in Windows Phone 8.1 è però diversa dal modo in viene riprodotto l'audio in background in Windows 8. Questo modello è anche diverso dagli agenti audio in background usati nelle versioni precedenti di Windows Phone.
Importante
Puoi usare JavaScript per scrivere applicazioni per audio in background. Windows Phone 8.1 non consente tuttavia l'esecuzione di JavaScript in un processo in background. Ciò significa che puoi scrivere in JavaScript l'interfaccia utente e l'app in primo piano, ma l'attività in background deve essere scritta in C# or C++. L' esempio relativo all'audio in background per Windows Phone 8.1 illustra un'app JavaScript che supporta l'audio in background mediante l'agente in background di C#.
Lo spazio dei nomi Windows.Media.Playback introduce API generiche per la riproduzione di audio e può essere usato anche per la riproduzione di musica in primo piano, ma lo scopo primario di queste API è la riproduzione di audio in background. Quando si usa questa API, esiste una singola classe MediaPlayer globale attraverso cui avviene tutta la riproduzione. L'app per audio in background invia comandi al lettore multimediale per l'impostazione della traccia corrente, l'avvio della riproduzione, la sospensione, l'avanzamento rapido, il riavvolgimento e così via. Per eseguire queste operazioni devi chiamare i metodi nella classe MediaPlayer. L'oggetto istanza del lettore multimediale, a cui si accede tramite la proprietà BackgroundMediaPlayer.Current, comunica con il lettore multimediale globale per manipolare la riproduzione dell'audio.
Non puoi creare nuove istanze di MediaPlayer.
Usa la classe SystemMediaTransportControls per generare gli eventi utilizzati dal controllo del volume universale (UVC, Universal Volume Control), ovvero l'interfaccia utente visualizzata quando l'utente preme il controllo volume sul dispositivo. Usa SystemMediaTransportControls per manipolare il lettore multimediale. Oltre all'avvio della riproduzione dell'audio dall'app, puoi controllarne anche la riproduzione. Puoi ad esempio usare SystemMediaTransportControls per inviare eventi a IBackgroundTask nell'app e puoi implementare la logica della playlist. Più avanti in questo argomento sono disponibili ulteriori informazioni sull'interfaccia IBackgroundTask.
Il diagramma seguente è una rappresentazione molto semplice di come è progettato il sistema. Un'app che esegue riproduzioni in background è costituita da due processi. Il primo è rappresentato dall'app principale, che contiene l'interfaccia utente e che viene eseguita in primo piano. Il secondo è l'attività di riproduzione in background, che contiene gli strumenti per la riproduzione in background e, facoltativamente, logica dell'app. Il processo in primo piano viene sospeso o terminato dal sistema operativo in base alle esigenze a livello di risorse. Il processo in background continua l'esecuzione.
Mentre la riproduzione dell'audio avviene nel processo in background, il processo in primo piano ha accesso a tutte le informazioni tramite oggetti proxy. Il processo in primo piano può gestire le proprietà dell'istanza di MediaPlayer nel processo in background. L'app in primo piano può ricevere notifiche di eventi specifici del contenuto multimediale, come MediaOpened, MediaEnded e MediaFailed. Al termine del processo in primo piano o se l'app viene sospesa, la riproduzione del contenuto multimediale continua.
Controlli di sistema per il trasporto multimediale
SystemMediaTransportControls è un nuovo set di API introdotto in Windows 8.1. Anche Windows Phone 8.1 implementa questa classe, ma poiché ha un solo controllo del volume globale, è possibile l'interazione di un solo processo alla volta. Nel contesto delle API MediaPlayer, è estremamente importante definire l'istanza e tutti i gestori nel processo in background. Ciò garantirà che la connessione venga associata al processo corretto in caso di terminazione dell'app in primo piano.
Invio di messaggi tra attività
In alcuni casi dovrai gestire la comunicazione tra i due processi di un'app per audio in background. Ad esempio, è possibile che l'attività in background debba notificare l'avvio della riproduzione di una nuova traccia all'attività in primo piano e poi inviare il titolo del nuovo brano all'attività in primo piano per visualizzarlo sullo schermo. Un meccanismo di comunicazione semplice genera eventi sia nel processo in primo piano che in quello in background. I metodi SendMessageToForeground e SendMessageToBackground richiamano eventi nell'attività corrispondente. I dati possono essere passati come argomento al gestore eventi nell'attività ricevente. Passare i dati tramite una nuova classe chiamata ValueSet. Questa classe è un dizionario che contiene una stringa come chiave e altri tipi di valore come valori. Puoi passare tipi di valori semplici come int, string, bool e così via.
Ciclo di vita dell'attività in background
La durata di un'attività in background è strettamente collegata alla capacità dell'app di riprodurre musica. Quando un utente sospende la riproduzione dell'audio, ad esempio, il sistema potrebbe interrompere o annullare l'app a seconda delle circostanze.
L'attività in background viene avviata la prima volta che l'app accede a BackgroundMediaPlayer.Current nel codice dell'app in primo piano o quando registri un gestore per l'evento MessageReceivedFromBackground, a seconda di quale condizione si verifica prima. Per garantire che vengano stabiliti i canali di comunicazione quando viene chiamato il metodo IBackgroundTask.Run, devi registrare l'evento MessageReceivedFromBackground prima di accedere alla proprietà BackgroundMediaPlayer.Current per la prima volta. La tua app dovrebbe aspettare che l'attività in background sia in esecuzione prima di tentare l'avvio della riproduzione audio. In questo modo avrai la possibilità di sottoscrivere eventi multimediali.
Per mantenere attiva l'attività in background, la tua app dovrà recuperare BackgroundTaskDeferral nel metodo Run e chiamare BackgroundTaskDeferral.Complete quando l'istanza dell'attività riceve gli eventi Canceled o Completed. Non attendere nel metodo Run, perché comporta un uso di risorse e potrebbe causare l'interruzione dell'attività in background dell'app.
La tua attività in background riceve l'evento Completed al completamento del metodo Run e quando non viene richiesto il differimento. In alcuni casi, quando l'app riceve l'evento Canceled, questo potrebbe anche essere seguito dall'evento Completed.
Un'attività in background può essere annullata nelle situazioni seguenti:
- Viene avviata una nuova app con funzionalità di riproduzione audio.
- È stata avviata un'attività in background ma la musica non è ancora in riproduzione e quindi l'app in primo piano viene sospesa.
- Alcuni minuti dopo l'avvio dell'attività in background, la riproduzione viene sospesa e viene sospesa anche l'app in primo piano. La riproduzione può essere sospesa dall'utente o da altre interruzioni multimediali, come chiamate in arrivo o chiamate VoIP. Se la chiamata telefonica o VoIP termina entro cinque minuti, l'app riceverà la notifica Run con il pulsante SystemMediaTransportControlsButton.Play indicato in SystemMediaTransportControlsButtonPressedEventArgs. In caso contrario, l'utente dovrà avviare in modo esplicito la riproduzione tramite il controllo del volume universale. Il controllo del volume universale non perde il suo stato. Quando l'utente seleziona il pulsante Riproduci, l'attività in background viene tuttavia riavviata. Determina quindi una chiamata al metodo Run e una notifica SystemMediaTransportControlsButton.Play.
Un'attività in background può essere interrotta senza avviso nelle circostanze seguenti:
- Arrivo di una chiama VoIP in condizioni di memoria insufficiente
- Violazione di criteri per le risorse
- Conclusione non normale dell'annullamento o del completamento dell'attività
Procedure consigliate per l'audio in background
La pipeline multimediale è asincrona per definizione e ciò significa che per gli eventi generati ne viene garantita solo l'occorrenza, ma non l'ordine. Se la tua app recupera un file audio da un'origine remota, ad esempio, l'app riceverà vari eventi di modifica dello stato, come Starting, Paused, Closed e così via. Questi gestori non vengono necessariamente chiamati ogni volta nello stesso ordine. Non dovresti dipendere eccessivamente dai valori di CurrentState nel gestore di CurrentStateChanged.
MediaOpened è un evento molto importante che svolge più ruoli. Se hai impostato AutoPlay su false e imposti l'origine per MediaPlayer, riceverai comunque MediaOpened. Questo evento indica che la pipeline multimediale è inizializzata e il contenuto multimediale è pronto per la riproduzione. Quando imposti un'origine, la riproduzione multimediale viene avviata automaticamente. Non devi chiamare Play dopo aver impostato l'origine. Un'altra tecnica molto valida consiste nell'avviare la riproduzione in modo esplicito quando il contenuto multimediale è pronto. Puoi ottenere questo risultato impostando AutoPlay su false e con una chiamata specifica di Play nel gestore dell'evento MediaOpened.
Puoi impostare l'origine multimediale su diversi tipi diversi di contenuto chiamando SetUriSource, SetFileSource, SetMediaSource o SetStreamSource. MediaPlayer supporta anche la riproduzione di contenuto protetto. Invece di impostare un'origine URI, il sistema dipende dagli oggetti dell'app o dal codice dell'app in esecuzione in memoria. Il processo in background, inoltre, non sarà a conoscenza della memoria per il processo nell'attività in primo piano. Assicurati quindi di definire tutti gli oggetti in modo che impostino l'origine solo nel processo in background. Il sistema genererà un'eccezione InvalidCastException se la tua app tenta di impostare un'origine diversa da un URI nel processo in background.
BackgroundMediaPlayer.Shutdown chiude la pipeline multimediale e rilascia l'oggetto MediaPlayer dalla memoria. Se tenti di nuovo di accedere a un riferimento a BackgroundMediaPlayer.Current dopo la chiamata di Shutdown, riceverai un errore. Il metodo Shutdown è progettato affinché un'app possa ripulire la pipeline multimediale dopo l'annullamento della sua attività.
Quando la tua app viene sospesa, ricordati di annullare la sottoscrizione per gli eventi MediaPlayer. In caso contrario potresti riscontrare attività indesiderate che potrebbero portare alla terminazione del processo in background. Questo non significa, tuttavia, che il processo in primo piano scomparirà da Cambia attività e l'utente potrà ancora tornare all'app. Alla ripresa dell'app, se stai ancora mantenendo un riferimento a una classe MediaPlayer sospesa, verrà generato un errore se l'attività di audio in background è stata annullata e la pipeline multimediale chiusa.