Freigeben über


Medienwiedergabe im Hintergrund (Legacy)

In diesem Artikel wird das Legacymodell mit zwei Prozessen beschrieben, um Ihrer UWP-App Hintergrundaudiounterstützung hinzuzufügen. Ab Windows 10, Version 1607, ist ein Einzelprozessmodell für Hintergrundaudio, das wesentlich einfacher zu implementieren ist. Weitere Informationen zu den aktuellen Empfehlungen für Hintergrundaudio finden Sie unter Wiedergeben von Medien im Hintergrund. Dieser Artikel soll Unterstützung für Apps bereitstellen, die bereits mit dem älteren Zweiprozessmodell entwickelt wurden.

Hinweis

Ab Windows, Version 1703, ist BackgroundMediaPlayer veraltet und ist in zukünftigen Versionen von Windows möglicherweise nicht verfügbar.

Architektur von Hintergrundaudio

Eine App, die die Hintergrundwiedergabe ausführt, besteht aus zwei Prozessen. Der erste Prozess ist die Haupt-App, die die App-UI und Clientlogik enthält, die im Vordergrund ausgeführt wird. Der zweite Prozess ist die Hintergrundwiedergabeaufgabe, die IBackgroundTask wie alle Hintergrundaufgaben der UWP-App implementiert. Die Hintergrundaufgabe enthält die Logik für die Audiowiedergabe und Hintergrunddienste. Die Hintergrundaufgabe kommuniziert mit dem System über die Steuerelemente für den Systemmedientransport.

Das folgende Diagramm ist eine Übersicht darüber, wie das System entworfen wird.

Windows 10-Hintergrundaudioarchitektur

MediaPlayer

Der Windows.Media.Playback-Namespace enthält APIs, die zum Wiedergeben von Audio im Hintergrund verwendet werden. Es gibt eine einzelne Instanz von MediaPlayer pro App, über die die Wiedergabe erfolgt. Ihre Hintergrundaudio-App ruft Methoden auf und legt Eigenschaften für die MediaPlayer-Klasse fest, um den aktuellen Titel festzulegen, die Wiedergabe zu starten, anzuhalten, schnell vorwärts, zurückspulen usw. Auf die Media Player-Objektinstanz wird immer über die BackgroundMediaPlayer.Current-Eigenschaft zugegriffen.

MediaPlayer-Proxy und Stub

Wenn auf BackgroundMediaPlayer.Current über den Hintergrundprozess Ihrer App zugegriffen wird, wird die MediaPlayer-Instanz im Hintergrundaufgabenhost aktiviert und kann direkt bearbeitet werden.

Wenn von der Vordergrundanwendung auf "BackgroundMediaPlayer.Current" zugegriffen wird, ist die zurückgegebene MediaPlayer-Instanz tatsächlich ein Proxy, der mit einem Stub im Hintergrundprozess kommuniziert. Dieser Stub kommuniziert mit der tatsächlichen MediaPlayer-Instanz , die auch im Hintergrundprozess gehostet wird.

Sowohl der Vordergrund- als auch der Hintergrundprozess können auf die meisten Eigenschaften der MediaPlayer-Instanz zugreifen, mit Ausnahme von "MediaPlayer.Source" und "MediaPlayer.SystemMediaTransportControls", auf die nur über den Hintergrundprozess zugegriffen werden kann. Die Vordergrund-App und der Hintergrundprozess können beide Benachrichtigungen über medienspezifische Ereignisse wie MediaOpened, MediaEnded und MediaFailed empfangen.

Wiedergabelisten

Ein häufiges Szenario für Hintergrundaudioanwendungen besteht darin, mehrere Elemente in einer Zeile wiederzugeben. Dies wird in Ihrem Hintergrundprozess am einfachsten mithilfe eines MediaPlaybackList-Objekts erreicht, das als Quelle für den MediaPlayer festgelegt werden kann, indem er sie der MediaPlayer.Source-Eigenschaft zuweist.

Es ist nicht möglich, auf eine MediaPlaybackList aus dem Vordergrundprozess zuzugreifen, der im Hintergrundprozess festgelegt wurde.

Steuerelemente für den Systemmedientransport

Ein Benutzer kann die Audiowiedergabe steuern, ohne die Benutzeroberfläche Ihrer App direkt über Bluetooth-Geräte, SmartGlass und die Steuerelemente für den Systemmedientransport zu verwenden. Ihre Hintergrundaufgabe verwendet die SystemMediaTransportControls-Klasse , um diese vom Benutzer initiierten Systemereignisse zu abonnieren.

Um eine SystemMediaTransportControls-Instanz aus dem Hintergrundprozess abzurufen, verwenden Sie die MediaPlayer.SystemMediaTransportControls-Eigenschaft. Vordergrund-Apps rufen eine Instanz der Klasse durch Aufrufen von SystemMediaTransportControls.GetForCurrentView ab, die zurückgegebene Instanz ist jedoch eine nur vordergrundbasierte Instanz, die sich nicht auf die Hintergrundaufgabe bezieht.

Senden von Nachrichten zwischen Aufgaben

Es gibt Zeiten, in denen Sie zwischen den beiden Prozessen einer Hintergrundaudio-App kommunizieren möchten. So möchten Sie beispielsweise, dass die Hintergrundaufgabe die Vordergrundaufgabe benachrichtigen soll, wenn eine neue Titelwiedergabe beginnt, und dann den neuen Titel an die Vordergrundaufgabe senden, um sie auf dem Bildschirm anzuzeigen.

Ein einfacher Kommunikationsmechanismus löst Ereignisse sowohl im Vordergrund- als auch im Hintergrundprozess aus. Die Methoden SendMessageToForeground und SendMessageToBackground rufen jedes Ereignis im entsprechenden Prozess auf. Nachrichten können empfangen werden, indem sie die Ereignisse MessageReceivedFromBackground und MessageReceivedFromForeground abonnieren.

Daten können als Argument an die Sendenachrichtenmethoden übergeben werden, die dann an die Ereignishandler für empfangene Nachrichten übergeben werden. Übergeben Sie Daten mithilfe der ValueSet-Klasse. Diese Klasse ist ein Wörterbuch, das eine Zeichenfolge als Schlüssel und andere Werttypen als Werte enthält. Sie können einfache Werttypen wie ganze Zahlen, Zeichenfolgen und Booleane übergeben.

Lebenszyklus von Hintergrundaufgaben

Die Lebensdauer einer Hintergrundaufgabe ist eng mit dem aktuellen Wiedergabestatus Ihrer App verknüpft. Wenn der Benutzer beispielsweise die Audiowiedergabe angehalten hat, kann das System Ihre App abhängig von den Umständen beenden oder abbrechen. Nach einer bestimmten Zeit ohne Audiowiedergabe kann das System die Hintergrundaufgabe automatisch herunterfahren.

Die IBackgroundTask.Run-Methode wird aufgerufen, wenn Ihre App zum ersten Mal von Code, der in der Vordergrund-App ausgeführt wird, auf "BackgroundMediaPlayer.Current" zugreift oder wenn Sie einen Handler für das MessageReceivedFromBackground-Ereignis registrieren, je nachdem, was zuerst auftritt. Es wird empfohlen, dass Sie sich für den empfangenen Nachrichtenhandler registrieren, bevor Sie BackgroundMediaPlayer.Current zum ersten Mal aufrufen, damit die Vordergrund-App keine Nachrichten verpasst, die vom Hintergrundprozess gesendet werden.

Damit die Hintergrundaufgabe aktiv bleibt, muss Ihre App eine BackgroundTaskDeferral aus der Run-Methode anfordern und BackgroundTaskDeferral.Complete aufrufen, wenn die Aufgabeninstanz die Ereignisse "Canceled" oder "Completed" empfängt. Warten Sie nicht, oder warten Sie in der Run-Methode , da dies Ressourcen verbraucht und die Hintergrundaufgabe Ihrer App möglicherweise vom System beendet wird.

Die Hintergrundaufgabe ruft das Completed-Ereignis ab, wenn die Run-Methode abgeschlossen ist und die Verzögerung nicht angefordert wird. In einigen Fällen kann die App auch auf das "Completed"-Ereignis folgen, wenn Die App das Ereignis "Canceled" abruft. Ihre Aufgabe empfängt möglicherweise ein "Canceled "-Ereignis, während "Ausführen" ausgeführt wird. Achten Sie daher darauf, diese potenzielle Parallelität zu verwalten.

Situationen, in denen die Hintergrundaufgabe abgebrochen werden kann, umfassen:

  • Eine neue App mit Audiowiedergabefunktionen beginnt auf Systemen, die die Exklusivitätsunterrichtlinie erzwingen. Weitere Informationen finden Sie weiter unten in den Systemrichtlinien für die Lebensdauer von Hintergrundaudioaufgaben.

  • Eine Hintergrundaufgabe wurde gestartet, musik wird jedoch noch nicht wiedergegeben, und dann wird die Vordergrund-App angehalten.

  • Andere Medienunterbrechungen, z. B. eingehende Telefonanrufe oder VoIP-Anrufe.

Situationen, in denen die Hintergrundaufgabe ohne vorherige Ankündigung beendet werden kann:

  • Ein VoIP-Anruf wird eingelöst, und es steht nicht genügend Arbeitsspeicher auf dem System zur Verfügung, um die Hintergrundaufgabe lebendig zu halten.

  • Eine Ressourcenrichtlinie wird verletzt.

  • Der Abbruch oder abschluss der Aufgabe endet nicht ordnungsgemäß.

Systemrichtlinien für die Lebensdauer von Hintergrundaudioaufgaben

Die folgenden Richtlinien helfen, zu bestimmen, wie das System die Lebensdauer von Hintergrundaudioaufgaben verwaltet.

Exklusivität

Wenn diese Unterrichtlinie aktiviert ist, beschränkt diese Unterrichtlinie die Anzahl der Hintergrundaudioaufgaben auf höchstens 1 zu einem bestimmten Zeitpunkt. Sie ist auf Mobilen und anderen Nicht-Desktop-SKUs aktiviert.

Inaktivitätstimeout

Aufgrund von Ressourceneinschränkungen kann das System ihre Hintergrundaufgabe nach einer Bestimmten Inaktivität beenden.

Eine Hintergrundaufgabe wird als "inaktiv" betrachtet, wenn beide der folgenden Bedingungen erfüllt sind:

  • Die Vordergrund-App ist nicht sichtbar (sie wird angehalten oder beendet).

  • Der Media Player im Hintergrund befindet sich nicht im Wiedergabezustand.

Wenn beide Bedingungen erfüllt sind, startet die Richtlinie für das Hintergrundmediensystem einen Timer. Wenn keine bedingung geändert wurde, wenn der Timer abläuft, beendet die Richtlinie für das Hintergrundmediensystem die Hintergrundaufgabe.

Freigegebene Lebensdauer

Wenn diese Unterrichtlinie aktiviert ist, wird die Hintergrundaufgabe von der Lebensdauer der Vordergrundaufgabe abhängig. Wenn die Vordergrundaufgabe vom Benutzer oder vom System heruntergefahren wird, wird die Hintergrundaufgabe ebenfalls heruntergefahren.

Beachten Sie jedoch, dass dies nicht bedeutet, dass der Vordergrund vom Hintergrund abhängig ist. Wenn die Hintergrundaufgabe heruntergefahren wird, erzwingt dies nicht das Herunterfahren der Vordergrundaufgabe.

In der folgenden Tabelle sind die Richtlinien aufgeführt, die für welche Gerätetypen erzwungen werden.

Unterrichtlinie Desktop Mobil Andere
Exklusivität Disabled Aktiviert Aktiviert
Inaktivitätstimeout Disabled Aktiviert Disabled
Freigegebene Lebensdauer Aktiviert Disabled Disabled