Compartilhar via


Reproduzir mídia em segundo plano

Este artigo mostra como configurar seu aplicativo para que a mídia continue a ser reproduzida quando seu aplicativo for movido do primeiro plano para o plano de fundo. Isso significa que, mesmo depois que o usuário tiver minimizado seu aplicativo, retornado à tela inicial ou saído do aplicativo de alguma outra forma, seu aplicativo poderá continuar a reproduzir áudio.

Os cenários para reprodução de áudio em segundo plano incluem:

  • Listas de reprodução de longa duração: o usuário abre brevemente um aplicativo em primeiro plano para selecionar e iniciar uma lista de reprodução, após o que o usuário espera que a lista de reprodução continue sendo reproduzida em segundo plano.

  • Usando o alternador de tarefas: o usuário abre brevemente um aplicativo em primeiro plano para iniciar a reprodução de áudio e, em seguida, alterna para outro aplicativo aberto usando o alternador de tarefas. O usuário espera que o áudio continue sendo reproduzido em segundo plano.

A implementação de áudio em segundo plano descrita neste artigo permitirá que seu aplicativo seja executado universalmente em todos os dispositivos Windows, incluindo Mobile, Desktop e Xbox.

Observação

O código neste artigo foi adaptado do exemplo de áudio em segundo plano da UWP.

Explicação do modelo de um processo

Com Windows 10, versão 1607, foi introduzido um novo modelo de processo único que simplifica muito o processo de habilitação do áudio em segundo plano. Anteriormente, seu aplicativo era obrigado a gerenciar um processo em segundo plano, além do aplicativo em primeiro plano e, em seguida, comunicar manualmente as alterações de estado entre os dois processos. No novo modelo, basta adicionar o recurso de áudio em segundo plano ao manifesto do aplicativo e seu aplicativo continuará reproduzindo áudio automaticamente quando for movido para o plano de fundo. Dois novos eventos de ciclo de vida do aplicativo, EnteredBackground e LeavingBackground, permitem que seu aplicativo saiba quando ele está entrando e saindo do plano de fundo. Quando seu aplicativo se move para as transições de ou para o segundo plano, as restrições de memória impostas pelo sistema podem mudar, portanto, você pode usar esses eventos para verificar o consumo de memória atual e liberar recursos para ficar abaixo do limite.

Ao eliminar a complexa comunicação entre processos e o gerenciamento de estado, o novo modelo permite que você implemente o áudio em segundo plano muito mais rapidamente com uma redução significativa no código. No entanto, o modelo de dois processos ainda é suportado na versão atual para compatibilidade com versões anteriores. Para obter mais informações, consulte Modelo de áudio em segundo plano herdado.

Requisitos para áudio de fundo

Seu aplicativo deve atender aos seguintes requisitos para reprodução de áudio enquanto seu aplicativo está em segundo plano.

  • Adicione a funcionalidade de reprodução de mídia em segundo plano ao manifesto do aplicativo, conforme descrito posteriormente neste artigo.
  • Se o aplicativo desabilitar a integração automática do MediaPlayer com os SMTC (Controles de Transporte de Mídia do Sistema), por exemplo, definindo a propriedade CommandManager.IsEnabled como false, você deverá implementar a integração manual com o SMTC para habilitar a reprodução de mídia em segundo plano. Você também deve integrar manualmente ao SMTC se estiver usando uma API diferente do MediaPlayer, como o AudioGraph, para reproduzir áudio se quiser que o áudio continue a ser reproduzido quando o aplicativo for movido para o segundo plano. Os requisitos mínimos de integração SMTC são descritos na seção "Usar os controles de transporte de mídia do sistema para áudio em segundo plano" do Controle manual dos controles de transporte de mídia do sistema.
  • Enquanto seu aplicativo estiver em segundo plano, você deve permanecer abaixo dos limites de uso de memória definidos pelo sistema para aplicativos em segundo plano. As diretrizes para gerenciar a memória em segundo plano são fornecidas posteriormente neste artigo.

Capacidade de manifesto de reprodução de mídia em segundo plano

Para habilitar o áudio em segundo plano, você deve adicionar o recurso de reprodução de mídia em segundo plano ao arquivo de manifesto do aplicativo, Package.appxmanifest.

Para adicionar recursos ao manifesto do aplicativo usando o designer de manifesto

  1. No Microsoft Visual Studio, no Gerenciador de Soluções, abra o designer do manifesto do aplicativo clicando duas vezes no item package.appxmanifest.
  2. Selecione a guia Funcionalidades.
  3. Marque a caixa de seleção Reprodução de mídia em segundo plano.

Para definir a funcionalidade editando manualmente o xml do manifesto do aplicativo, primeiro verifique se o prefixo do namespace uap3 está definido no elemento Package . Caso contrário, adicione-o conforme mostrado abaixo.

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

Em seguida, adicione o recurso backgroundMediaPlayback ao elemento Capabilities :

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

Lidar com a transição entre o primeiro plano e o plano de fundo

Quando o aplicativo é movido do primeiro para o segundo plano, o evento EnteredBackground é acionado. E quando seu aplicativo retorna ao primeiro plano, o evento LeavingBackground é gerado. Como esses são eventos de ciclo de vida do aplicativo, você deve registrar manipuladores para esses eventos quando seu aplicativo for criado. No modelo de projeto padrão, isso significa adicioná-lo ao construtor da classe App no App.xaml.cs.

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

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

Crie uma variável para controlar se você está executando em segundo plano.

bool _isInBackgroundMode = false;

Quando o evento EnteredBackground for acionado, defina a variável de rastreamento para indicar que você está em execução em segundo plano. Você não deve executar tarefas de longa duração no evento EnteredBackground porque isso pode fazer com que a transição para o plano de fundo pareça lenta para o usuário.

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

No manipulador de eventos LeavingBackground , você deve definir a variável de rastreamento para indicar que seu aplicativo não está mais em execução em segundo plano.

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

Requisitos de gerenciamento de memória

A parte mais importante de lidar com a transição entre o primeiro plano e o plano de fundo é gerenciar a memória que seu aplicativo usa. Como a execução em segundo plano reduzirá os recursos de memória que seu aplicativo tem permissão para reter pelo sistema, você também deve se registrar para os eventos AppMemoryUsageIncreased e AppMemoryUsageLimitChanging. Quando esses eventos são gerados, você deve verificar o uso de memória atual do aplicativo e o limite atual e, em seguida, reduzir o uso de memória, se necessário. Para obter informações sobre como reduzir o uso de memória durante a execução em segundo plano, consulte Liberar memória quando o aplicativo for movido para o segundo plano.

Disponibilidade de rede para aplicativos de mídia em segundo plano

Todas as fontes de mídia com reconhecimento de rede, aquelas que não são criadas a partir de um fluxo ou arquivo, manterão a conexão de rede ativa enquanto recuperam o conteúdo remoto e a liberam quando não estiverem. MediaStreamSource, especificamente, depende do aplicativo para relatar corretamente o intervalo de buffer correto para a plataforma usando SetBufferedRange. Depois que todo o conteúdo for totalmente armazenado em buffer, a rede não será mais reservada em nome do aplicativo.

Se você precisar fazer chamadas de rede que ocorrem em segundo plano quando a mídia não está sendo baixada, elas devem ser encapsuladas em uma tarefa apropriada, como MaintenanceTrigger ou TimeTrigger. Para obter mais informações, consulte Dar suporte ao seu aplicativo com tarefas em segundo plano.