Delen via


Media afspelen op de achtergrond

In dit artikel leest u hoe u uw app configureert, zodat media blijven afspelen wanneer uw app van de voorgrond naar de achtergrond wordt verplaatst. Dit betekent dat zelfs nadat de gebruiker uw app heeft geminimaliseerd, terug is gegaan naar het startscherm of op een andere manier van uw app is genavigeerd, uw app audio kan blijven afspelen.

Scenario's voor het afspelen van achtergrondaudio zijn onder andere:

  • Langlopende afspeellijsten: De gebruiker brengt kort een voorgrond-app naar voren om een afspeellijst te selecteren en te starten, waarna de gebruiker verwacht dat de afspeellijst op de achtergrond blijft afspelen.

  • Taakwisselaar gebruiken: De gebruiker brengt kort een voorgrond-app naar voren om te beginnen met het afspelen van audio en schakelt vervolgens over naar een andere geopende app met behulp van de taakwisselaar. De gebruiker verwacht dat de audio op de achtergrond blijft afspelen.

Met de achtergrondaudio-implementatie die in dit artikel wordt beschreven, kan uw app universeel worden uitgevoerd op alle Windows-apparaten, waaronder Mobile, Desktop en Xbox.

Opmerking

De code in dit artikel is aangepast van het UWP achtergrond-audiovoorbeeld.

Uitleg van een procesmodel

Met Windows 10 versie 1607 is een nieuw model voor één proces geïntroduceerd dat het proces van het inschakelen van achtergrondaudio aanzienlijk vereenvoudigt. Voorheen was uw app vereist om een achtergrondproces te beheren naast uw voorgrond-app en vervolgens handmatig statuswijzigingen tussen de twee processen te communiceren. Onder het nieuwe model voegt u gewoon de mogelijkheid voor achtergrondaudio toe aan uw app-manifest. Uw app blijft automatisch audio afspelen wanneer deze naar de achtergrond wordt verplaatst. Twee nieuwe gebeurtenissen voor de levenscyclus van toepassingen, EnteredBackground en LeavingBackground , laten uw app weten wanneer deze de achtergrond invoert en verlaat. Wanneer uw app overgaat naar of van de achtergrond, kunnen de geheugenbeperkingen die door het systeem worden afgedwongen, veranderen, zodat u deze gebeurtenissen kunt gebruiken om uw huidige geheugenverbruik te controleren en resources vrij te maken om onder de limiet te blijven.

Door de complexe communicatie tussen processen en statusbeheer te elimineren, kunt u met het nieuwe model veel sneller achtergrondaudio implementeren met een aanzienlijke vermindering van code. Het model met twee processen wordt echter nog steeds ondersteund in de huidige release voor compatibiliteit met eerdere versies. Voor meer informatie, zie verouderde achtergrondaudiomodel.

Vereisten voor achtergrondaudio

Uw app moet voldoen aan de volgende vereisten voor het afspelen van audio terwijl uw app zich op de achtergrond bevindt.

  • Voeg de mogelijkheid Achtergrondmedia Afspelen toe aan uw app-manifest, zoals verderop in dit artikel wordt beschreven.
  • Als uw app de automatische integratie van MediaPlayer met de System Media Transport Controls (SMTC) uitschakelt, bijvoorbeeld door de eigenschap CommandManager.IsEnabled in te stellen op false, moet u handmatige integratie met de SMTC implementeren om het afspelen van achtergrondmedia mogelijk te maken. U moet ook handmatig integreren met SMTC als u een andere API gebruikt dan MediaPlayer, zoals AudioGraph, om audio af te spelen als u de audio wilt laten afspelen wanneer uw app naar de achtergrond wordt verplaatst. De minimale vereisten voor SMTC-integratie worden beschreven in het gedeelte "Gebruik de systeemmedia-transportbedieningselementen voor achtergrondaudio" van Handmatige controle van de System Media Transport Controls.
  • Terwijl uw app zich op de achtergrond bevindt, moet u onder de limieten voor geheugengebruik blijven die zijn ingesteld door het systeem voor achtergrond-apps. Richtlijnen voor het beheren van geheugen op de achtergrond vindt u verderop in dit artikel.

Mogelijkheid voor het afspelen van achtergrondmedia in manifesten

Als u achtergrondaudio wilt inschakelen, moet u de mogelijkheid voor het afspelen van achtergrondmedia toevoegen aan het manifestbestand van de app, Package.appxmanifest.

Mogelijkheden toevoegen aan het app-manifest met behulp van de manifestontwerper

  1. Open in Microsoft Visual Studio, in Solution Explorer, de ontwerpfunctie voor het toepassingsmanifest door te dubbelklikken op het item package.appxmanifest.
  2. Selecteer het tabblad Capaciteiten.
  3. Vink het selectievakje Afspelen van achtergrondmedia aan.

Als u de mogelijkheid wilt instellen door het xml-bestand van het app-manifest handmatig te bewerken, moet u eerst controleren of het voorvoegsel van de uap3-naamruimte is gedefinieerd in het pakketelement . Zo niet, voeg deze toe zoals hieronder wordt weergegeven.

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

Voeg vervolgens de backgroundMediaPlayback-mogelijkheid toe aan het element Capabilities :

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

Overgang tussen voorgrond en achtergrond afhandelen

Wanneer uw app van de voorgrond naar de achtergrond wordt verplaatst, treedt de gebeurtenis EnteredBackground op. En wanneer uw app terugkeert naar de voorgrond, wordt de gebeurtenis LeavingBackground gegenereerd. Omdat dit levenscyclus-gebeurtenissen voor apps zijn, moet u handlers registreren voor deze gebeurtenissen wanneer uw app wordt gemaakt. In de standaardprojectsjabloon betekent dit dat u deze toevoegt aan de app-klasseconstructor in App.xaml.cs.

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

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

Maak een variabele om bij te houden of je momenteel op de achtergrond draait.

bool _isInBackgroundMode = false;

Wanneer de gebeurtenis EnteredBackground wordt gegenereerd, stelt u de trackingvariabele in om aan te geven dat u momenteel op de achtergrond actief bent. U moet geen langlopende taken uitvoeren in de gebeurtenis EnteredBackground , omdat dit ertoe kan leiden dat de overgang naar de achtergrond traag wordt weergegeven voor de gebruiker.

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

In de LeavingBackground event handler moet u de traceringsvariabele instellen die aangeeft dat uw app niet meer op de achtergrond wordt uitgevoerd.

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

Vereisten voor geheugenbeheer

Het belangrijkste onderdeel van het afhandelen van de overgang tussen voorgrond en achtergrond is het beheren van het geheugen dat uw app gebruikt. Omdat het draaien op de achtergrond de geheugenbronnen vermindert die uw app van het systeem mag gebruiken, moet u zich ook registreren voor de AppMemoryUsageIncreased en AppMemoryUsageLimitChanging evenementen. Wanneer deze gebeurtenissen worden gegenereerd, moet u het huidige geheugengebruik van uw app en de huidige limiet controleren en het geheugengebruik zo nodig verminderen. Zie Gratis geheugen wanneer uw app naar de achtergrond wordt verplaatst naar de achtergrondvoor informatie over het verminderen van het geheugengebruik tijdens het uitvoeren op de achtergrond.

Netwerk beschikbaarheid voor achtergrondmedia-apps

Alle netwerkbewuste mediabronnen, die niet afkomstig zijn van een stream of een bestand, houden de netwerkverbinding actief tijdens het ophalen van externe inhoud en beëindigen de verbinding wanneer ze dat niet doen. MediaStreamSourceis daarom afhankelijk van de toepassing om op de juiste manier het gebufferde bereik aan het platform te rapporteren met behulp van SetBufferedRange. Nadat de volledige inhoud volledig is gebufferd, wordt het netwerk niet langer namens de app gereserveerd.

Als u netwerkaanroepen wilt maken die op de achtergrond plaatsvinden wanneer media niet worden gedownload, moeten deze worden verpakt in een geschikte taak, zoals MaintenanceTrigger of TimeTrigger. Zie Uw app ondersteunen met achtergrondtakenvoor meer informatie.