Reprodução de mídia em segundo plano herdada

Este artigo descreve o modelo herdado de dois processos para adicionar suporte de áudio em segundo plano ao seu aplicativo UWP. A partir do Windows 10, versão 1607, um modelo de processo único para áudio em segundo plano que é muito mais simples de implementar. Para obter mais informações sobre as recomendações atuais para áudio em segundo plano, consulte Reproduzir mídia em segundo plano. Este artigo destina-se a fornecer suporte para aplicativos que já foram desenvolvidos usando o modelo herdado de dois processos.

Observação

A partir do Windows, versão 1703, o BackgroundMediaPlayer foi preterido e pode não estar disponível em versões futuras do Windows.

Arquitetura de áudio em segundo plano

Um aplicativo que executa a reprodução em segundo plano consiste em dois processos. O primeiro processo é o aplicativo principal, que contém a interface do usuário do aplicativo e a lógica do cliente, em execução em primeiro plano. O segundo processo é a tarefa de reprodução em segundo plano, que implementa IBackgroundTask como todas as tarefas em segundo plano do aplicativo UWP. A tarefa em segundo plano contém a lógica de reprodução de áudio e os serviços em segundo plano. A tarefa em segundo plano se comunica com o sistema por meio dos controles de transporte de mídia do sistema.

O diagrama a seguir é uma visão geral de como o sistema é projetado.

Arquitetura de áudio em segundo plano do Windows 10

MediaPlayer

O namespace Windows.Media.Playback contém APIs usadas para reproduzir áudio em segundo plano. Há uma única instância do MediaPlayer por aplicativo por meio da qual ocorre a reprodução. Seu aplicativo de áudio em segundo plano chama métodos e define propriedades na classe MediaPlayer para definir a faixa atual, iniciar a reprodução, pausar, avançar, retroceder e assim por diante. A instância do objeto do reprodutor de mídia sempre é acessada por meio da propriedade BackgroundMediaPlayer.Current .

Proxy e stub do MediaPlayer

Quando BackgroundMediaPlayer.Current é acessado do processo em segundo plano do aplicativo, a instância do MediaPlayer é ativada no host de tarefas em segundo plano e pode ser manipulada diretamente.

Quando BackgroundMediaPlayer.Current é acessado do aplicativo em primeiro plano, a instância do MediaPlayer retornada é, na verdade, um proxy que se comunica com um stub no processo em segundo plano. Esse stub se comunica com a instância real do MediaPlayer , que também é hospedada no processo em segundo plano.

O processo em primeiro plano e em segundo plano pode acessar a maioria das propriedades da instância do MediaPlayer, com exceção de MediaPlayer.Source e MediaPlayer.SystemMediaTransportControls, que só podem ser acessados do processo em segundo plano. O aplicativo em primeiro plano e o processo em segundo plano podem receber notificações de eventos específicos de mídia, como MediaOpened, MediaEnded e MediaFailed.

Listas de reprodução

Um cenário comum para aplicativos de áudio em segundo plano é reproduzir vários itens seguidos. Isso é feito com mais facilidade em seu processo em segundo plano usando um objeto MediaPlaybackList, que pode ser definido como uma fonte no MediaPlayer atribuindo-o à propriedade MediaPlayer.Source.

Não é possível acessar um MediaPlaybackList do processo em primeiro plano que foi definido no processo em segundo plano.

Controles de transporte de mídia do sistema

Um usuário pode controlar a reprodução de áudio sem usar diretamente a interface do usuário do aplicativo por meios como dispositivos Bluetooth, SmartGlass e os controles de transporte de mídia do sistema. Sua tarefa em segundo plano usa a classe SystemMediaTransportControls para assinar esses eventos do sistema iniciados pelo usuário.

Para obter uma instância SystemMediaTransportControls de dentro do processo em segundo plano, use a propriedade MediaPlayer.SystemMediaTransportControls. Os aplicativos em primeiro plano obtêm uma instância da classe chamando SystemMediaTransportControls.GetForCurrentView, mas a instância retornada é uma instância somente em primeiro plano que não se relaciona com a tarefa em segundo plano.

Enviando mensagens entre tarefas

Há momentos em que você deseja se comunicar entre os dois processos de um aplicativo de áudio em segundo plano. Por exemplo, talvez você queira que a tarefa em segundo plano notifique a tarefa em primeiro plano quando uma nova faixa começar a ser reproduzida e, em seguida, envie o novo título da música para a tarefa em primeiro plano para exibição na tela.

Um mecanismo de comunicação simples gera eventos nos processos de primeiro e segundo plano. Os métodos SendMessageToForeground e SendMessageToBackground invocam eventos no processo correspondente. As mensagens podem ser recebidas assinando os eventos MessageReceivedFromBackground e MessageReceivedFromForeground.

Os dados podem ser passados como um argumento para os métodos de envio de mensagem que são passados para os manipuladores de eventos recebidos pela mensagem. Passe dados usando a classe ValueSet . Essa classe é um dicionário que contém uma cadeia de caracteres como uma chave e outros tipos de valor como valores. Você pode passar tipos de valor simples, como inteiros, cadeias de caracteres e booleanos.

Ciclo de vida da tarefa em segundo plano

O tempo de vida de uma tarefa em segundo plano está intimamente ligado ao status de reprodução atual do seu aplicativo. Por exemplo, quando o usuário pausa a reprodução de áudio, o sistema pode encerrar ou cancelar seu aplicativo, dependendo das circunstâncias. Após um período de tempo sem reprodução de áudio, o sistema pode desligar automaticamente a tarefa em segundo plano.

O método IBackgroundTask.Run é chamado na primeira vez que seu aplicativo acessa BackgroundMediaPlayer.Current do código em execução no aplicativo em primeiro plano ou quando você registra um manipulador para o evento MessageReceivedFromBackground, o que ocorrer primeiro. É recomendável que você se registre no manipulador de mensagens recebidas antes de chamar BackgroundMediaPlayer.Current pela primeira vez para que o aplicativo em primeiro plano não perca nenhuma mensagem enviada do processo em segundo plano.

Para manter a tarefa em segundo plano ativa, seu aplicativo deve solicitar um BackgroundTaskDeferral de dentro do método Run e chamar BackgroundTaskDepassal.Complete quando a instância da tarefa receber os eventos Canceled ou Completed. Não faça loop ou aguarde no método Run porque isso consome recursos e pode fazer com que a tarefa em segundo plano do aplicativo seja encerrada pelo sistema.

Sua tarefa em segundo plano obtém o evento Completed quando o método Run é concluído e o adiamento não é solicitado. Em alguns casos, quando seu aplicativo recebe o evento Canceled , ele também pode ser seguido pelo evento Completed . Sua tarefa pode receber um evento Cancelado enquanto a execução está em execução, portanto, certifique-se de gerenciar essa possível simulação.

As situações em que a tarefa em segundo plano pode ser cancelada incluem:

  • Um novo aplicativo com recursos de reprodução de áudio é iniciado em sistemas que impõem a subpolítica de exclusividade. Consulte a seção Políticas do sistema para o tempo de vida da tarefa de áudio em segundo plano abaixo.

  • Uma tarefa em segundo plano foi iniciada, mas a música ainda não está tocando e, em seguida, o aplicativo em primeiro plano é suspenso.

  • Outras interrupções de mídia, como chamadas telefônicas recebidas ou chamadas VoIP.

As situações em que a tarefa em segundo plano pode ser encerrada sem aviso prévio incluem:

  • Uma chamada VoIP é recebida e não há memória disponível suficiente no sistema para manter a tarefa em segundo plano ativa.

  • Uma política de recursos é violada.

  • O cancelamento ou a conclusão da tarefa não termina normalmente.

Políticas do sistema para o tempo de vida da tarefa de áudio em segundo plano

As políticas a seguir ajudam a determinar como o sistema gerencia o tempo de vida das tarefas de áudio em segundo plano.

Exclusividade

Se habilitada, essa subpolítica limita o número de tarefas de áudio em segundo plano a ser no máximo 1 a qualquer momento. Ele está habilitado em SKUs móveis e outros que não são da área de trabalho.

Tempo limite de inatividade

Devido a restrições de recursos, o sistema pode encerrar sua tarefa em segundo plano após um período de inatividade.

Uma tarefa em segundo plano é considerada "inativa" se ambas as condições a seguir forem atendidas:

  • O aplicativo em primeiro plano não está visível (ele é suspenso ou encerrado).

  • O reprodutor de mídia em segundo plano não está no estado de reprodução.

Se ambas as condições forem atendidas, a política do sistema de mídia em segundo plano iniciará um temporizador. Se nenhuma das condições tiver sido alterada quando o temporizador expirar, a política do sistema de mídia em segundo plano encerrará a tarefa em segundo plano.

Vida Compartilhada

Se habilitada, essa subpolítica força a tarefa em segundo plano a depender do tempo de vida da tarefa em primeiro plano. Se a tarefa em primeiro plano for desligada, pelo usuário ou pelo sistema, a tarefa em segundo plano também será desligada.

No entanto, observe que isso não significa que o primeiro plano dependa do plano de fundo. Se a tarefa em segundo plano for desligada, isso não forçará a tarefa em primeiro plano a ser desligada.

A tabela a seguir lista quais políticas são impostas em quais tipos de dispositivo.

Subpolítica Área de trabalho Dispositivos móveis Outro
Exclusividade Desabilitado habilitado habilitado
Tempo limite de inatividade Desabilitado habilitado Desabilitado
Vida Compartilhada Enabled Desabilitado Desabilitado