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 nach dem Minimierten der App, der Rückkehr zum Startbildschirm oder eine andere Art und Weise von Ihrer App entfernt wurde, die App weiterhin Audio wiedergeben kann.

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

  • Wiedergabelisten mit langer Ausführung: Der Benutzer öffnet kurz eine Vordergrund-App, um eine Wiedergabeliste auszuwählen und zu starten, nach der der Benutzer erwartet, dass die Wiedergabeliste im Hintergrund fortgesetzt wird.

  • Verwenden der Aufgabenumschaltung: Der Benutzer öffnet kurz eine Vordergrund-App, um die Audiowiedergabe zu starten, und wechselt dann mithilfe des Aufgabenschalters 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-Hintergrundaudiobeispiel angepasst.

Erläuterung des einstufigen 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 zusätzlich zur Vordergrund-App einen Hintergrundprozess verwalten und dann manuell Zustandsänderungen zwischen den beiden Prozessen kommunizieren. Unter dem neuen Modell fügen Sie ihrem App-Manifest einfach die Hintergrundaudiofunktion hinzu, und Die App wird automatisch mit der Wiedergabe von Audio fortgesetzt, wenn sie in den Hintergrund verschoben wird. Zwei neue Anwendungslebenszyklusereignisse, EnteredBackground und LeavingBackground , lassen Ihre App wissen, wann sie eintritt und den Hintergrund 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 Funktion " Medienwiedergabe im Hintergrund" hinzu, wie weiter unten in diesem Artikel beschrieben.
  • Wenn Ihre App die automatische Integration von MediaPlayer in die Steuerelemente 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 in smTC implementieren, um die Medienwiedergabe im Hintergrund zu aktivieren. Sie müssen auch manuell in SMTC integriert werden, wenn Sie eine andere API als "MediaPlayer" (z . B. AudioGraph) verwenden, um Audio wiederzugeben, wenn die Audiowiedergabe fortgesetzt werden soll, 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 Manuellen Steuerelements für den Medientransport 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-Explorer, den Designer für das Anwendungsmanifest, indem Sie auf das Element package.appxmanifest doppelklicken.
  2. Wählen Sie die Registerkarte Funktionen aus.
  3. Aktivieren Sie das Kontrollkästchen "Medienwiedergabe im Hintergrund".

Um die Funktion durch manuelles Bearbeiten der App-Manifest-XML festzulegen, stellen Sie zunächst sicher, dass das Präfix des uap3-Namespaces 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 backgroundMediaPlayback-Funktion zum Capabilities-Element hinzu:

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

Behandeln des Übergangs zwischen Vordergrund und Hintergrund

Wenn Ihre App vom Vordergrund zum Hintergrund wechselt, wird das EnteredBackground-Ereignis ausgelöst. Und wenn Ihre App zum Vordergrund zurückkehrt, wird das LeavingBackground-Ereignis 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, legen Sie die Nachverfolgungsvariable fest, um anzugeben, dass Sie derzeit im Hintergrund ausgeführt werden. Sie sollten keine lang ausgeführten Aufgaben im EnteredBackground-Ereignis ausführen, da dies dazu führen kann, dass der Übergang zum Hintergrund für den Benutzer langsam erscheint.

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

Im LeavingBackground-Ereignishandler sollten Sie die Nachverfolgungsvariable so festlegen, dass Ihre App nicht mehr im Hintergrund ausgeführt wird.

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

Speicherverwaltungsanforderungen

Der wichtigste Teil der Behandlung des Übergangs zwischen Vordergrund und Hintergrund ist die Verwaltung des von Der App verwendeten Arbeitsspeichers. Da die Ausführung im Hintergrund die Speicherressourcen verringert, 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 während der Ausführung im Hintergrund finden Sie unter "Freier Arbeitsspeicher", 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, behalten die Netzwerkverbindung beim Abrufen von Remoteinhalten aktiv bei, und sie geben sie frei, wenn sie nicht sind. MediaStreamSource basiert insbesondere darauf, dass die Anwendung den richtigen 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 auftreten, wenn Medien nicht heruntergeladen werden, müssen diese in eine entsprechende Aufgabe wie MaintenanceTrigger oder TimeTrigger eingeschlossen werden. Weitere Informationen finden Sie unter "Unterstützen Ihrer App mit Hintergrundaufgaben".