Wiedergeben von Medien im HintergrundPlay media in the background

In diesem Artikel wird beschrieben, wie Sie Ihre App so konfigurieren, dass die Medienwiedergabe fortgesetzt wird, wenn die App vom Vordergrund in den Hintergrund wechselt.This article shows you how to configure your app so that media continues to play when your app moves from the foreground to the background. Dies bedeutet, dass die App weiterhin Audio wiedergeben kann, auch nachdem der Benutzer die App minimiert hat, zur Startseite zurückgekehrt ist oder die App auf andere Weise verlassen hat.This means that even after the user has minimized your app, returned to the home screen, or has navigated away from your app in some other way, your app can continue to play audio.

Beispiele für Szenarien mit der Wiedergabe von Hintergrundaudio:Scenarios for background audio playback include:

  • Langzeit-Wiedergabelisten Der Benutzer ruft kurz eine Vordergrund-App auf, um eine Wiedergabeliste auszuwählen und zu starten, und erwartet anschließend, dass die Wiedergabeliste kontinuierlich im Hintergrund wiedergegeben wird.Long-running playlists: The user briefly brings up a foreground app to select and start a playlist, after which the user expects the playlist to continue playing in the background.

  • 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.Using task switcher: The user briefly brings up a foreground app to start playing audio, then switches to another open app using the task switcher. Der Benutzer erwartet, dass die Audiowiedergabe im Hintergrund fortgesetzt wird.The user expects the audio to continue playing in the background.

Dank der in diesem Artikel beschriebenen Implementierung von Hintergrundaudio kann die App universell auf allen Windows-Geräten, einschließlich Mobile, Desktop und Xbox, ausgeführt werden.The background audio implementation described in this article will allow your app to run universally on all Windows devices including Mobile, Desktop, and Xbox.

Hinweis

Der Code in diesem Artikel wurde aus dem UWP-Beispiel für Hintergrundaudio übernommen und angepasst.The code in this article was adapted from the UWP Background Audio sample.

Erläuterung des EinzelprozessmodellsExplanation of one-process model

Mit Windows 10, Version 1607, wurde ein neues Einzelprozessmodell eingeführt, das die Aktivierung von Hintergrundaudio erheblich vereinfacht.With Windows 10, version 1607, a new single-process model has been introduced that greatly simplifies the process of enabling background audio. Zuvor musste Ihre App zusätzlich zur Vordergrund-App einen Hintergrundprozess verwalten und die Statusänderungen zwischen den beiden Prozessen manuell kommunizieren.Previously, your app was required to manage a background process in addition to your foreground app and then manually communicate state changes between the two processes. Beim neuen Modell fügen Sie Ihrem App-Manifest einfach die Hintergrundaudio-Funktion hinzu, damit die Audiowiedergabe automatisch fortgesetzt wird, wenn die App in den Hintergrund wechselt.Under the new model, you simply add the background audio capability to your app manifest, and your app will automatically continue playing audio when it moves to the background. Durch die beiden neuen App-Lebenszyklusereignisse EnteredBackground und LeavingBackground weiß Ihre App, wann sie in den Hintergrund wechselt bzw. den Hintergrund wieder verlässt.Two new application lifecycle events, EnteredBackground and LeavingBackground let your app know when it is entering and leaving the background. Beim Übergang der App in den bzw. aus dem Hintergrund können sich die vom System erzwungenen Speicherbeschränkungen ändern. Sie können diese Ereignisse also verwenden, um die aktuelle Arbeitsspeichernutzung zu überprüfen und Ressourcen freizugeben, damit Sie unter dem Grenzwert bleiben.When your app moves into the transitions to or from the background, the memory constraints enforced by the system may change, so you can use these events to check your current memory consumption and free up resources in order to stay below the limit.

Durch den Wegfall der komplexen prozessübergreifenden Kommunikation und Zustandsverwaltung ermöglicht Ihnen das neue Modell, Hintergrundaudio mit deutlich geringerem Programmieraufwand viel schneller zu implementieren.By eliminating the complex cross-process communication and state management, the new model allows you to implement background audio much more quickly with a significant reduction in code. Aus Gründen der Abwärtskompatibilität wird das aus zwei Prozessen bestehende Modell in der aktuellen Version jedoch weiterhin unterstützt.However, the two-process model is still supported in the current release for backwards compatibility. Weitere Informationen finden Sie unter Hintergrundaudio-Modell (Legacy).For more information, see Legacy background audio model.

Anforderungen für HintergrundaudioRequirements for background audio

Ihre App muss die folgenden Anforderungen für die Audiowiedergabe erfüllen, während sie sich im Hintergrund befindet.Your app must meet the following requirements for audio playback while your app is in the background.

  • Fügen Sie Ihrem App-Manifest die Funktion Medienwiedergabe im Hintergrund wie weiter unten in diesem Artikel beschrieben hinzu.Add the Background Media Playback capability to your app manifest, as described later in this article.
  • Wenn die automatische Integration von MediaPlayer in die Steuerelemente für den Systemmedientransport (System Media Transport Controls, SMTC) von der App deaktiviert wird (z. B. durch Festlegen der CommandManager.IsEnabled-Eigenschaft auf FALSE), müssen Sie die manuelle Integration in SMTC implementieren, um die Medienwiedergabe im Hintergrund zu aktivieren.If your app disables the automatic integration of MediaPlayer with the System Media Transport Controls (SMTC), such as by setting the CommandManager.IsEnabled property to false, then you must implement manual integration with the SMTC in order to enable background media playback. Die manuelle Integration in SMTC ist auch erforderlich, wenn Sie eine andere API als MediaPlayer (z. B. AudioGraph) verwenden, um die Audiowiedergabe beim Wechsel der App in den Hintergrund fortzusetzen.You must also manually integrate with SMTC if you are using an API other than MediaPlayer, such as AudioGraph, to play audio if you want to have the audio continue to play when your app moves to the background. Die Mindestanforderungen für die SMTC-Integration sind im Abschnitt „Verwenden der Steuerelemente für den Systemmedientransport für Audiowiedergabe im Hintergrund“ von Manuelle Steuerung der Steuerelemente für den Systemmedientransport beschrieben.The minimum SMTC integration requirements are described in the "Use the system media transport controls for background audio" section of Manual control of the System Media Transport Controls.
  • Während sich Ihre App im Hintergrund befindet, müssen Sie unterhalb der Grenzwerte für die Speicherauslastung bleiben, die vom System für Hintergrund-Apps festgelegt wurden.While your app is in the background, you must stay under the memory usage limits set by the system for background apps. Eine Anleitung zur Verwaltung des Arbeitsspeichers, während die App im Hintergrund ausgeführt wird, finden Sie später in diesem Artikel.Guidance for managing memory while in the background is provided later in this article.

Manifestfunktion „Medienwiedergabe im Hintergrund“Background media playback manifest capability

Wenn Sie Hintergrundaudio aktivieren möchten, müssen Sie der App-Manifestdatei „Package.appxmanifest“ die Funktion „Medienwiedergabe im Hintergrund“ hinzufügen.To enable background audio, you must add the background media playback capability to the app manifest file, Package.appxmanifest.

So fügen Sie dem App-Manifest mithilfe des Manifest-Designers Funktionen hinzuTo add capabilities to the app manifest using the manifest designer

  1. Öffnen Sie in Microsoft Visual Studio im Projektmappen-Explorer den Designer für das Anwendungsmanifest, indem Sie auf das Element package.appxmanifest doppelklicken.In Microsoft Visual Studio, in Solution Explorer, open the designer for the application manifest by double-clicking the package.appxmanifest item.
  2. Wählen Sie die Registerkarte Funktionen aus.Select the Capabilities tab.
  3. Aktivieren Sie das Kontrollkästchen Medienwiedergabe im Hintergrund.Select the Background Media Playback check box.

Wenn Sie die Funktion festlegen möchten, indem Sie die XML-Datei des App-Manifests manuell bearbeiten, müssen Sie zunächst sicherstellen, dass das Namespacepräfix uap3 im Package-Element definiert ist.To set the capability by manually editing the app manifest xml, first make sure that the uap3 namespace prefix is defined in the Package element. Wenn dies nicht der Fall ist, fügen Sie es gemäß den folgenden Schritten hinzu.If not, add it as shown below.

<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">

Als Nächstes fügen Sie dem Capabilities-Element die backgroundMediaPlayback-Funktion hinzu:Next, add the backgroundMediaPlayback capability to the Capabilities element:

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

Verarbeiten der Übergänge zwischen Vordergrund und HintergrundHandle transitioning between foreground and background

Wenn Ihre App vom Vordergrund in den Hintergrund wechselt, wird das EnteredBackground-Ereignis ausgelöst.When your app moves from the foreground to the background, the EnteredBackground event is raised. Wechselt die App dann wieder in den Vordergrund, wird das LeavingBackground-Ereignis ausgelöst.And when your app returns to the foreground, the LeavingBackground event is raised. Da es sich dabei um App-Lebenszyklusereignisse handelt, sollten Sie bei der App-Erstellung Handler für diese Ereignisse registrieren.Because these are app lifecycle events, you should register handlers for these events when your app is created. In der Standardprojektvorlage wird der Handler dem App-Klassenkonstruktor in „App.xaml.cs“ hinzugefügt.In the default project template, this means adding it to the App class constructor in App.xaml.cs.

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

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

Erstellen Sie eine Variable, um nachzuverfolgen, ob die App momentan im Hintergrund ausgeführt wird.Create a variable to track whether you are currently running in the background.

bool _isInBackgroundMode = false;

Wenn das EnteredBackground-Ereignis ausgelöst wird, legen Sie die Nachverfolgungsvariable fest, um anzugeben, dass die App momentan im Hintergrund ausgeführt wird.When the EnteredBackground event is raised, set the tracking variable to indicate that you are currently running in the background. Langzeitaufgaben sollten im EnteredBackground-Ereignis nicht ausgeführt werden, da der Übergang in den Hintergrund dem Benutzer dadurch langsam erscheinen könnte.You should not perform long-running tasks in the EnteredBackground event because this may cause the transition to the background to appear slow to the user.

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

Im LeavingBackground-Ereignishandler sollten Sie die Nachverfolgungsvariable festlegen, um anzugeben, dass die App nicht mehr im Hintergrund ausgeführt wird.In the LeavingBackground event handler, you should set the tracking variable to indicate that your app is no longer running in the background.

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

Anforderungen an die SpeicherverwaltungMemory management requirements

Den wichtigsten Teil beim Übergang zwischen Vorder- und Hintergrund stellt die Verwaltung des von der App genutzten Speichers dar.The most important part of handling the transition between foreground and background is managing the memory that your app uses. Da die Ausführung im Hintergrund die Speicherressourcen verringert, die der App vom System gewährt werden, sollten Sie die App auch für das AppMemoryUsageIncreased-Ereignis und das AppMemoryUsageLimitChanging-Ereignis registrieren.Because running in the background will reduce the memory resources your app is allowed to retain by the system, you should also register for the AppMemoryUsageIncreased and AppMemoryUsageLimitChanging events. Wenn diese Ereignisse ausgelöst werden, sollten Sie die aktuelle Speicherbelegung und den aktuellen Grenzwert Ihrer App überprüfen und die Speichernutzung ggf. reduzieren.When these events are raised, you should check your app's current memory usage and the current limit, and then reduce your memory usage if needed. Informationen dazu, wie Sie die Speichernutzung während der Ausführung im Hintergrund reduzieren, finden Sie unter Geben Sie Speicher frei, wenn Ihre App in den Hintergrund verschoben wird.For information about reducing your memory usage while running in the background, see Free memory when your app moves to the background.

Netzwerkverfügbarkeit für im Hintergrund ausgeführte Medien-AppsNetwork availability for background media apps

Alle netzwerkfähigen Medienquellen, die nicht auf der Basis eines Datenstroms oder einer Datei erstellt wurden, behalten beim Abrufen von Remoteinhalten eine aktive Netzwerkverbindung bei. Andernfalls wird die Verbindung nicht beibehalten.All network aware media sources, those that are not created from a stream or a file, will keep the network connection active while retrieving remote content, and they release it when they are not. Insbesondere bei MediaStreamSource kommt es darauf an, dass die Anwendung den richtigen Pufferbereich mithilfe von SetBufferedRange an die Plattform übergibt.MediaStreamSource, specifically, relies on the application to correctly report the correct buffered range to the platform using SetBufferedRange. Nachdem der gesamte Inhalt vollständig gepuffert wurde, wird die Netzwerkverbindung nicht mehr für die App reserviert.After the entire content is fully buffered, the network will no longer be reserved on the app’s behalf.

Wenn Sie Netzwerk Aufrufe durchführen müssen, die im Hintergrund auftreten, wenn Medien nicht heruntergeladen werden, müssen diese in einer entsprechenden Aufgabe wie Maintenance- oder time-Auslösersumschließt werden.If you need to make network calls that occur in the background when media is not downloading, these must be wrapped in an appropriate task like MaintenanceTrigger or TimeTrigger. Weitere Informationen finden Sie unter unterstützen der APP mit Hintergrundaufgaben.For more information, see Support your app with background tasks.