Freigeben über


Wiedergeben von Medien im Hintergrund

In diesem Artikel erfahren Sie, wie Sie Ihre App so konfigurieren, dass Medien weiterhin wiedergegeben werden, wenn Ihre App vom Vordergrund zum Hintergrund wechselt. Dies bedeutet, dass Ihre App auch, nachdem der Benutzer Ihre App minimiert hat, zum Startbildschirm zurückgekehrt ist oder auf eine andere Weise von Ihrer App navigiert ist, weiterhin Audio wiedergeben kann.

Zu den Szenarien für die Audiowiedergabe im Hintergrund gehören:

  • Langlaufende Wiedergabelisten: Der Benutzer öffnet kurz eine Vordergrund-App, um eine Wiedergabeliste auszuwählen und zu starten. Danach erwartet der Benutzer, dass die Wiedergabeliste weiterhin im Hintergrund wiedergegeben wird.

  • Verwenden des Task-Umschalters: Der Benutzer öffnet kurz eine App im Vordergrund, um Musik abzuspielen, und wechselt dann mithilfe des Task-Umschalters zu einer anderen geöffneten App. Der Benutzer erwartet, dass die Audiowiedergabe im Hintergrund fortgesetzt wird.

Die in diesem Artikel beschriebene Implementierung des Hintergrundaudios ermöglicht es Ihrer App, universell auf allen Windows-Geräten, einschließlich Mobile, Desktop und Xbox, auszuführen.

Hinweis

Der Code in diesem Artikel wurde aus dem UWP-Hintergrundaudiobeispielangepasst.

Erläuterung des ein-Prozess-Modells

Mit Windows 10, Version 1607, wurde ein neues Einzelprozessmodell eingeführt, das den Prozess der Aktivierung von Hintergrundaudio erheblich vereinfacht. Zuvor musste Ihre App neben Ihrer Vordergrund-App auch einen Hintergrundprozess verwalten und dann manuell die Zustandsänderungen zwischen den beiden Prozessen kommunizieren. Unter dem neuen Modell fügen Sie Ihrem App-Manifest einfach die Hintergrundaudiofunktion hinzu, und Ihre App wird automatisch weiter Audio wiedergeben, wenn sie in den Hintergrund wechselt. Zwei neue Anwendungslebenszyklusereignisse, EnteredBackground und LeavingBackground, lassen Ihre App wissen, wann sie in den Hintergrund wechselt und wann sie ihn verlässt. Wenn Ihre App in die Übergänge zum oder vom Hintergrund wechselt, können sich die vom System erzwungenen Speichereinschränkungen ändern, sodass Sie diese Ereignisse verwenden können, um den aktuellen Speicherverbrauch zu überprüfen und Ressourcen freizugeben, um unter dem Grenzwert zu bleiben.

Durch die Beseitigung der komplexen prozessübergreifenden Kommunikation und Zustandsverwaltung ermöglicht Ihnen das neue Modell die Implementierung von Hintergrundaudio viel schneller mit einer erheblichen Reduzierung von Code. Das Modell mit zwei Prozessen wird jedoch weiterhin in der aktuellen Version zur Abwärtskompatibilität unterstützt. Weitere Informationen finden Sie unter Legacy-Hintergrundaudiomodell.

Anforderungen für Hintergrundaudio

Ihre App muss die folgenden Anforderungen für die Audiowiedergabe erfüllen, während sich Ihre App im Hintergrund befindet.

  • Fügen Sie Ihrem App-Manifest die Fähigkeit für Background Media Playback hinzu, wie in diesem Artikel weiter unten beschrieben.
  • Wenn Ihre App die automatische Integration von MediaPlayer- mit den Steuerelementen für den Systemmedientransport (System Media Transport Controls, SMTC) deaktiviert, z. B. durch Festlegen der CommandManager.IsEnabled-Eigenschaft auf "false", müssen Sie die manuelle Integration mit dem SMTC implementieren, um die Wiedergabe im Hintergrund zu aktivieren. Sie müssen sich auch manuell in SMTC integrieren, wenn Sie eine andere API als den MediaPlayerverwenden, z. B. AudioGraph, um Audio abzuspielen. Dies ist erforderlich, damit die Audiowiedergabe fortgesetzt wird, wenn Ihre App in den Hintergrund wechselt. Die Mindestanforderungen an die SMTC-Integration werden im Abschnitt "Verwenden der Steuerelemente für den Systemmedientransport für Hintergrundaudio" des Handbuchs unter "Manuelle Steuerung der Steuerelemente für den Systemmedientransport"beschrieben.
  • Während sich Ihre App im Hintergrund befindet, müssen Sie unter den vom System für Hintergrund-Apps festgelegten Speicherauslastungsgrenzwerten bleiben. Anleitungen zum Verwalten von Arbeitsspeicher im Hintergrund finden Sie weiter unten in diesem Artikel.

Manifestfunktion für die Medienwiedergabe im Hintergrund

Um Hintergrundaudio zu aktivieren, müssen Sie der App-Manifestdatei "Package.appxmanifest" die Funktion für die Medienwiedergabe im Hintergrund hinzufügen.

So fügen Sie dem App-Manifest Mithilfe des Manifest-Designers Funktionen hinzu

  1. Öffnen Sie in Microsoft Visual Studio im Projektmappen-Explorerden Designer für das Anwendungsmanifest, indem Sie auf das Element package.appxmanifest doppelt klicken.
  2. Wählen Sie die Registerkarte Fähigkeiten aus.
  3. Aktivieren Sie das Kontrollkästchen Hintergrundmedienwiedergabe .

Um die Funktion durch manuelles Bearbeiten des XML-App-Manifests festzulegen, stellen Sie zunächst sicher, dass das uap3-Namespacepräfix im -Package--Element definiert ist. Wenn nicht, fügen Sie sie wie unten dargestellt hinzu.

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

Fügen Sie als Nächstes die Funktion backgroundMediaPlayback zum Element Capabilities hinzu.

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

Umgang mit dem Übergang zwischen Vordergrund und Hintergrund

Wenn Ihre App vom Vordergrund zum Hintergrund wechselt, wird das EnteredBackground Ereignis ausgelöst. Und wenn Ihre App in den Vordergrund zurückkehrt, wird das Ereignis LeavingBackground ausgelöst. Da es sich hierbei um App-Lebenszyklusereignisse handelt, sollten Sie Handler für diese Ereignisse registrieren, wenn Ihre App erstellt wird. In der Standardprojektvorlage bedeutet dies, dass sie dem App- Klassenkonstruktor in App.xaml.cs hinzugefügt wird.

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

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

Erstellen Sie eine Variable, um nachzuverfolgen, ob Sie derzeit im Hintergrund ausgeführt werden.

bool _isInBackgroundMode = false;

Wenn das EnteredBackground-Ereignis ausgelöst wird, setzen Sie die Nachverfolgungsvariable, um anzugeben, dass Sie gerade im Hintergrund laufen. Sie sollten im EnteredBackground-- Ereignis keine langlaufenden Aufgaben ausführen, da dies den Übergang zum Hintergrund für den Benutzer verlangsamen kann.

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

Im LeavingBackground Ereignishandlers sollten Sie die Nachverfolgungsvariable festlegen, um anzugeben, dass Ihre App nicht mehr im Hintergrund ausgeführt wird.

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

Speicherverwaltungsanforderungen

Der wichtigste Aspekt der Handhabung des Übergangs zwischen Vordergrund und Hintergrund ist die Verwaltung des von der App verwendeten Speichers. Da die Ausführung im Hintergrund die Speicherressourcen reduziert, die Ihre App vom System behalten darf, sollten Sie sich auch für die Ereignisse AppMemoryUsageIncreased und AppMemoryUsageLimitChanging registrieren. Wenn diese Ereignisse ausgelöst werden, sollten Sie die aktuelle Speicherauslastung Ihrer App und den aktuellen Grenzwert überprüfen und bei Bedarf die Speicherauslastung verringern. Informationen zum Verringern der Speicherauslastung, wenn Ihre App in den Hintergrund wechselt, finden Sie unter Speicher freigeben, wenn Ihre App in den Hintergrund wechselt.

Netzwerkverfügbarkeit für Hintergrundmedien-Apps

Alle netzwerkfähigen Medienquellen, die nicht aus einem Datenstrom oder einer Datei erstellt werden, halten die Netzwerkverbindung während des Abrufs von Remote-Inhalten aktiv aufrecht und geben sie frei, wenn der Abruf beendet ist. MediaStreamSource-verlässt sich insbesondere darauf, dass die Anwendung den gepufferten Bereich mithilfe von SetBufferedRange-korrekt an die Plattform meldet. Nachdem der gesamte Inhalt vollständig gepuffert wurde, wird das Netzwerk nicht mehr im Namen der App reserviert.

Wenn Sie Netzwerkaufrufe tätigen müssen, die im Hintergrund stattfinden, wenn Medien nicht heruntergeladen sind, müssen diese in eine entsprechende Aufgabe wie MaintenanceTrigger oder TimeTriggereingebunden werden. Weitere Informationen finden Sie unter Unterstützen Ihrer App mit Hintergrundaufgaben.