Übersicht: Hintergrundaudio (Windows Phone Store-Apps, HTML)

[ Dieser Artikel richtet sich an Windows 8.x- und Windows Phone 8.x-Entwickler, die Windows-Runtime-Apps schreiben. Wenn Sie für Windows 10 entwickeln, finden Sie weitere Informationen unter neueste Dokumentation ]

Sie können Apps für Windows Phone 8.1 schreiben, die Audio im Hintergrund wiedergeben. Das heißt, auch wenn der Benutzer die App durch Drücken der Taste Zurück oder Start des Geräts beendet hat, kann die App weiterhin Audio wiedergeben. In diesem Artikel werden die Komponenten einer App für Hintergrundaudio und ihr Zusammenspiel erläutert.

Beispiele für Szenarien mit der Wiedergabe von Hintergrundaudio:

  • Lange Playlists Der Benutzer ruft kurz die Vordergrund-App auf, um eine Playlist auszuwählen und zu starten, und erwartet anschließend, dass die Playlist kontinuierlich im Hintergrund wiedergegeben wird.
  • Verwenden der Aufgabenumschaltfunktion Der Benutzer ruft kurz eine Vordergrund-App auf, um die Audiowiedergabe zu starten, und wechselt mit der Aufgabenumschaltfunktion dann zu einer anderen geöffneten App. Der Benutzer erwartet, dass die Audiowiedergabe im Hintergrund fortgesetzt wird.

Tipp  Sie können den Code für das Windows Phone 8.1-Beispiel für Hintergrundaudio herunterladen, in dem der in dieser Übersicht besprochene Code implementiert wird.

 

Architektur von Hintergrundaudio

Für eine Hintergrundaudio-App werden Hintergrund-Agents verwendet. Unter Windows Phone 8.1 wird Audio aber auf andere Weise im Hintergrund wiedergegeben als unter Windows 8. Das Modell unterscheidet sich auch im Hinblick auf die Hintergrundaudio-Agents, die in früheren Versionen von Windows Phone verwendet wurden.

Wichtig  

Sie können zum Schreiben von Hintergrundaudio-Anwendungen JavaScript verwenden. Jedoch kann JavaScript unter Windows Phone 8.1 nicht im Hintergrund ausgeführt werden. Das bedeutet, dass Ihre App und Ihre UI im Vordergrund in JavaScript geschrieben werden können, die Hintergrundaufgabe jedoch in C# oder C++ geschrieben werden muss. Das Windows Phone 8.1-Beispiel für Hintergrundaudio ist ein Beispiel für eine JavaScript-App, die Hintergrundaudio mithilfe eines C#-Hintergrund-Agents unterstützt.

 

Mit dem Windows.Media.Playback-Namespace werden generische Audio-APIs eingeführt. Mit diesem Namespace kann Musik zwar auch im Vordergrund wiedergegeben werden, aber der Hauptzweck besteht darin, Audio im Hintergrund wiederzugeben. Bei Verwendung dieser API erfolgt die gesamte Wiedergabe über einen zentralen globalen MediaPlayer. Ihre Hintergrundaudio-App sendet Befehle zum Festlegen des aktuellen Titels, zum Starten der Wiedergabe, zum Anhalten, zum schnellen Vor- und Zurückspulen usw. Dazu rufen Sie Methoden der MediaPlayer-Klasse auf. Das Medienwiedergabe-Instanzobjekt, auf das Sie über die BackgroundMediaPlayer.Current-Eigenschaft zugreifen, kommuniziert mit dem globalen Medienplayer, um die Audiowiedergabe zu ändern.

Sie können keine neuen Instanzen von MediaPlayer erstellen.

Verwenden Sie die SystemMediaTransportControls-Klasse zum Auslösen von Ereignissen, die von der zentralen Lautstärkeregelung (Universal Volume Control, UVC) verwendet werden. Die UI der UVC wird angezeigt, wenn Benutzer auf dem Gerät die Taste für die Lautstärkeregelung betätigen. Sie verwenden das SystemMediaTransportControls-Element, um Änderungen für den Medienplayer durchzuführen. Sie können die Audiowiedergabe über die App nicht nur starten, sondern auch steuern. Verwenden Sie z. B. das SystemMediaTransportControls-Element, um Ereignisse an die IBackgroundTask der App zu senden. Außerdem können Sie die Logik für die Playlists implementieren. Weiter unten in diesem Thema gehen wir weiter auf die IBackgroundTask ein.

Das folgende Diagramm ist eine sehr einfache Darstellung des Systemdesigns. Eine App für die Hintergrundwiedergabe besteht aus zwei Prozessen. Der erste Prozess ist die Haupt-App, die die UI enthält und im Vordergrund ausgeführt wird. Der zweite Prozess ist die Aufgabe für die Hintergrundwiedergabe, die die notwendigen Elemente für die Audiowiedergabe sowie optional eine App-Logik enthält. Der Vordergrundprozess wird vom Betriebssystem basierend auf dessen Ressourcenanforderungen angehalten oder beendet. Der Hintergrundprozess wird weiter ausgeführt.

Während die Audiowiedergabe im Hintergrundprozess erfolgt, hat der Vordergrundprozess über Proxyobjekte Zugriff auf alle Informationen. Der Vordergrundprozess kann die Eigenschaften der MediaPlayer-Instanz im Hintergrundprozess verwalten. Die Vordergrund-App kann Benachrichtigungen über medienspezifische Ereignisse wie MediaOpened, MediaEnded und MediaFailed empfangen. Nachdem der Vordergrundprozess beendet oder die App angehalten wurde, wird die Medienwiedergabe fortgesetzt.

Architektur von Hintergrundaudio

Steuerelemente für den Systemmedientransport

SystemMediaTransportControls ist ein neuer API-Satz, der in Windows 8.1 eingeführt wurde. Diese Klasse wird auch unter Windows 8.1 implementiert, aber da es unter Windows Phone eine globale Lautstärkeregelung gibt, kann nur jeweils ein Prozess damit interagieren. Im Kontext der MediaPlayer-APIs müssen Sie unbedingt die Instanz sowie alle Handler im Hintergrundprozess definieren. Damit stellen Sie sicher, dass die Verbindung an den richtigen Prozess gebunden wird, falls die Vordergrund-App beendet wird.

Senden von Nachrichten zwischen Aufgaben

Unter Umständen möchten Sie, dass die beiden Prozesse einer Hintergrund-App miteinander kommunizieren. Beispielsweise kann es sein, dass die Hintergrundaufgabe die Vordergrundaufgabe benachrichtigen soll, wenn die Wiedergabe eines neuen Titels gestartet wird. Außerdem soll dann der Songtitel an die Vordergrundaufgabe gesendet werden, damit er auf dem Bildschirm angezeigt wird. Über einen einfachen Kommunikationsmechanismus werden Ereignisse sowohl im Vordergrundprozess als auch im Hintergrundprozess ausgelöst. Die Methoden SendMessageToForeground und SendMessageToBackground rufen jeweils Ereignisse in der entsprechenden Aufgabe auf. Daten können als Argument an den Ereignishandler in der empfangenden Aufgabe übergeben werden. Übergeben Sie Daten mit der neuen ValueSet-Klasse. Bei dieser Klasse handelt es sich um ein Wörterbuch, das eine Zeichenfolge als Schlüssel und andere Werttypen als Werte enthält. Sie können einfache Werttypen übergeben, z. B. int, string, bool usw.

Lebenszyklus von Hintergrundaufgaben

Die Lebensdauer einer Hintergrundaufgabe ist eng mit der Musikwiedergabefunktion der App verknüpft. Wenn ein Benutzer die Audiowiedergabe beispielsweise anhält, kann das System die App je nach den Umständen beenden oder abbrechen.

Ihre Hintergrundaufgabe wird gestartet, wenn Ihre App das erste Mal auf BackgroundMediaPlayer.Current im App-Code im Vordergrund zugreift oder wenn Sie einen Handler für das MessageReceivedFromBackground-Ereignis registrieren, je nachdem, welcher Fall zuerst eintritt. Um beim Aufrufen der Methode IBackgroundTask.Run sicherzustellen, dass die Kommunikationskanäle eingerichtet sind, müssen Sie das MessageReceivedFromBackground-Ereignis vor dem ersten Zugriff auf die BackgroundMediaPlayer.Current-Eigenschaft registrieren. Die App sollte warten, bis die Hintergrundaufgabe ausgeführt wird, und erst dann die Audiowiedergabe starten. Auf diese Weise können Sie Medienereignisse abonnieren.

Damit die Hintergrundaufgabe aktiv bleibt, muss die App in der Run-Methode ein BackgroundTaskDeferral abrufen und BackgroundTaskDeferral.Complete aufrufen, wenn die Aufgabeninstanz das Ereignis Canceled oder Completed empfängt. Verwenden Sie in der Run-Methode keine Auslastung durch Warten, da dabei Ressourcen verwendet werden. Dies könnte dazu führen, dass die Hintergrundaufgabe der App beendet wird.

Die Hintergrundaufgabe ruft das Completed-Ereignis ab, wenn die Run-Methode abgeschlossen ist und keine Verzögerung angefordert wurde. In manchen Fällen kann, nachdem die App das Canceled-Ereignis abgerufen hat, das Completed-Ereignis folgen.

Eine Hintergrundaufgabe kann in den folgenden Situationen abgebrochen werden:

  • Eine neue App mit Audiowiedergabefunktionen wird gestartet.
  • Eine Hintergrundaufgabe wurde gestartet, aber es wird noch keine Musik wiedergegeben. Anschließend wird die Vordergrund-App angehalten.
  • Kurze Zeit nach dem Start der Hintergrundaufgabe werden die Wiedergabe und die Vordergrund-App angehalten. Die Wiedergabe kann vom Benutzer oder durch andere Medienunterbrechungen angehalten werden, z. B. durch eingehende Telefonanrufe oder VoIP-Anrufe. Wenn der Telefonanruf oder VoIP-Anruf innerhalb von fünf Minuten endet, empfängt die App die Run-Benachrichtigung. Dabei ist in den SystemMediaTransportControlsButtonPressedEventArgs die SystemMediaTransportControlsButton.Play-Schaltfläche angegeben. Andernfalls muss der Benutzer die Musikwiedergabe mithilfe der UVC ausdrücklich initiieren. Die UVC verliert ihren Status nicht. Wenn der Benutzer die Taste Play betätigt, wird die Hintergrundaufgabe aber neu gestartet. Sie erhalten dann einen Run-Methodenaufruf und eine SystemMediaTransportControlsButton.Play-Benachrichtigung.

In den folgenden Fällen kann eine Hintergrundaufgabe ohne Warnung beendet werden:

  • Ein VoIP-Anruf geht ein, und es ist nicht genug Speicher verfügbar.
  • Es wird gegen eine Ressourcenrichtlinie verstoßen.
  • Eine Aufgabe wird nicht korrekt abgebrochen oder abgeschlossen.

Bewährte Methoden für Hintergrundaudio

Die Medienpipeline ist von Natur aus asynchron, das heißt, die Auslösung der Ereignisse garantiert nur das Auftreten der Ereignisse, aber nicht ihre Reihenfolge. Wenn Ihre App z. B. eine Audiodatei aus einer Remotequelle abruft, werden verschiedene Ereignis zu geänderten Status abgerufen, z. B. Starting, Paused, Closed usw. Diese Handler werden nicht zwangsläufig jedes Mal in der gleichen Reihenfolge aufgerufen. Verlassen Sie sich nicht zu sehr auf die CurrentState-Werte im CurrentStateChanged-Handler.

MediaOpened ist ein sehr wichtiges Ereignis mit mehreren Rollen. Wenn Sie AutoPlay auf false festgelegt haben und die Quelle für MediaPlayer festlegen, empfangen Sie dennoch MediaOpened. Dies ist ein Hinweis darauf, dass die Medienpipeline initiiert wurde und die Medien wiedergegeben werden können. Wenn Sie eine Quelle festlegen, wird die Medienwiedergabe automatisch gestartet. Sie müssen nicht Play aufrufen, nachdem Sie die Quelle festgelegt haben. Eine weitere sehr gute Vorgehensweise besteht darin, die Wiedergabe explizit zu starten, wenn die Medien bereit sind. Dazu können Sie AutoPlay auf false festlegen und ausdrücklich Play im MediaOpened-Handler aufrufen.

Sie können die Medienquelle auf verschiedene Inhaltstypen festlegen, indem Sie SetUriSource, SetFileSource, SetMediaSource oder SetStreamSource aufrufen. Mit MediaPlayer können auch geschützte Inhalte wiedergegeben werden. Neben dem Festlegen einer URI-Quelle ist das System auf App-Objekte oder App-Code angewiesen, die im Speicher ausgeführt werden. Der Hintergrundprozess kennt außerdem den Prozessspeicher der Vordergrundaufgabe nicht. Achten Sie daher darauf, alle Objekte zu definieren, um ihre Quelle nur im Hintergrundprozess festzulegen. Das System löst eine InvalidCastException aus, wenn die App im Vordergrundprozess eine andere Quelle als einen URI festzulegen versucht.

BackgroundMediaPlayer.Shutdown schließt die Medienpipeline und gibt das MediaPlayer-Objekt aus dem Arbeitsspeicher frei. Wenn Sie nach dem Aufruf von Shutdown erneut auf einen Verweis auf BackgroundMediaPlayer.Current zuzugreifen versuchen, wird eine Fehlermeldung angezeigt. Shutdown ist dafür gedacht, dass eine App die Medienpipeline bereinigt, wenn ihre Aufgabe abgebrochen wird.

Wenn Ihre App angehalten wird, müssen Sie das Abonnement für MediaPlayer-Ereignisse aufheben, da es sonst zu unerwünschten Aktivitäten kommen kann. Dies kann dazu führen, dass der Vordergrundprozess beendet wird. Das bedeutet aber nicht, dass der Vordergrundprozess aus der Aufgabenumschaltfunktion verschwindet. Der Benutzer kann immer noch zurück zu der App wechseln. Wenn die App fortgesetzt wird, Sie noch einen Verweis auf einen angehaltenen MediaPlayer besitzen und die Hintergrundaudioaufgabe abgebrochen und die Medienpipeline heruntergefahren wurde, wird ein Fehler ausgelöst.

Verwandte Themen

Windows Phone 8.1-Beispiel für Hintergrundaudio

So wird's gemacht: Debuggen einer Hintergrundaufgabe