Na postagem Gerenciando o ciclo de vida, Adam Barrus descreveu o novo ciclo de vida do aplicativo apresentado no Windows 8. A pergunta mais comum que ouvimos é “e se o aplicativo precisar fazer algo importante como baixar um arquivo, email ou tocar música quando não estiver na tela”? Nesta série de duas partes, falaremos sobre os diferentes tipos de atividades que podem ser realizadas pelo aplicativo quando ele estiver em segundo plano e mostraremos alguns exemplos de código que oferecem suporte a esse cenário.

Modelo de segundo plano do Windows 8

O uso eficiente da bateria tem sido uma das bases fundamentais no design do Windows 8 e seu modelo de aplicativo. A postagem de Pat Stemen sobre o blog Criando o Windows 8 explica com detalhes o motivo da importância desse fator no design do Windows 8 e descreve algumas das técnicas que incorporamos no sistema para aumentar a vida útil da bateria. Como você pode imaginar, um dos fatores mais importantes na duração da vida útil da bateria de um dispositivo são os aplicativos executados nele. E levando isso em consideração, projetamos o ciclo de vida útil do aplicativo do Windows 8 para obtenção do máximo de vida útil da bateria. Mas isso não significa que o modelo de aplicativo impeça a realização de atividades em segundo plano. Esta postagem explica os cenários de segundo plano com suporte no Windows 8. Para obter mais informações sobre essa abordagem, consulte a postagem de Ben Srour e Sharif Farag Aperfeiçoando o consumo eficiente de energia de aplicativos no blog Criando o Windows 8.

Para criar o modelo de segundo plano do Windows 8, identificamos os cenários comuns que você quer que um aplicativo em segundo plano execute e adicionamos APIs que fazem isso com consumo eficiente de energia. Estes são os cenários com suporte no Windows 8 (também definidos na postagem aperfeiçoando o consumo eficiente de energia):

Cenário

Descrição

Download ou carregamento em segundo plano

Os aplicativos podem usar a API de transferência em segundo plano para carregar e baixar dados em segundo plano. O próprio sistema operacional executa o download e o carregamento aqui, o que exclui o código do aplicativo e ajuda a maximizar a vida útil da bateria.

Áudio em segundo plano

Certamente, queremos que você consiga ouvir música em segundo plano. Qualquer aplicativo de mídia ou comunicação pode reproduzir áudio em segundo plano. Para maximizar a eficiência do sistema e no consumo de energia, suspendemos o aplicativo quando o usuário pausa o áudio.

Compartilhamento

Se o aplicativo estiver enviando conteúdo para um serviço em nuvem usando o botão Compartilhar, essa operação será concluída em segundo plano. Mais informações sobre a transferência de dados durante uma operação Compartilhar estão disponíveis no Centro de Desenvolvimento.

Sincronização do dispositivo

Você pode sincronizar o conteúdo entre um dispositivo conectado (como uma câmera) e o seu PC até mesmo se o aplicativo não estiver visível na tela.

Blocos dinâmicos

Os aplicativos podem exibir o conteúdo mais recente em seus blocos (mesmo se estiverem suspensos) enviando notificações de push para seu PC com o Windows 8. Mais informações sobre a postagem Criando uma ótima experiência com blocos.

Notificações agendadas

Os aplicativos podem notificá-lo sobre um evento em um determinado horário atualizando um bloco (como compromissos no calendário) ou com uma notificação. O aplicativo agenda esses eventos, mas o Windows é responsável por fornecer a notificação, o que ajuda a minimizar o impacto da bateria. Encontre mais informações no Centro de Desenvolvimento.

Tarefas em segundo plano

Se um aplicativo suspenso precisar executar seu próprio código para fornecer funcionalidade, o Windows 8 fornecerá a capacidade de criar tarefas em segundo plano. Essas tarefas em segundo plano são executadas como respostas a acionamentos externos (como eventos de hora ou sistema ou entrada de notificações de push) e têm restrições de recursos que lhe são impostas para facilitar a realização de atividades em segundo plano de maneira favorável à energia. Os exemplos mais comuns de aplicativos que as usam são aplicativos de email, VoIP e mensagens instantâneas. Esses aplicativos podem sincronizar seus dados, em segundo plano enquanto estiverem com bateria, ou no modo Em espera conectado. Eles serão descritos na próxima postagem desta série.

Agora vamos mostrar como implementar alguns cenários comuns em aplicativos estilo Metro. Também explicaremos com mais detalhes algumas informações técnicas desses recursos e seus pontos mais importantes.

Os cenários descritos nesta série são relacionados aqui. Os primeiros dois itens são descritos nesta postagem, enquanto os últimos dois serão descritos na próxima.

  • Download ou carregamento em segundo plano
  • Áudio em segundo plano
  • Tarefas em segundo plano - trabalhando em segundo plano quando o dispositivo está usando energia AC.
  • Tarefas em segundo plano - download de emails de um servidor de email POP3 a cada 15 minutos

Agora vamos falar sobre códigos e ver como isso é simples no Windows 8. O exemplo de código incluído aqui serve apenas como exemplo e não como exemplo de códigos completos em todos os aspectos, por exemplo, não cobrimos tratamentos de erro.

Download ou carregamento em segundo plano

A transferência de conteúdo (como o carregamento de fotos, o download de vídeos ou música) é um cenário comum para muitos aplicativos. O namespace BackgroundTransfer fornece uma API simples e avançada que pode ser usada para transferir dados em primeiro e segundo plano. A API faz a maioria do trabalho, para que você possa se concentrar no que seu aplicativo faz melhor. Ele é otimizado para eficiência no consumo de energia, resiliente a falhas de rede e reconhecimento de custos de rede. Vejamos um exemplo específico: como fazer o download de um arquivo usando BackgroundTransfer.

BackgroundDownloader é o classe main que permite que você realize a maioria dos cenários de download ou carregamento em segundo plano. O exemplo abaixo demonstra a criação de um novo objeto DownloadOperation usando o classe BackgroundDownloader, que recebe um URI da fonte e um arquivo de destino. Com o download configurado, HandleDownloadAsync será chamado para iniciá-lo. No exemplo JavaScript, iniciamos a ação de download sem chamar outra função.

JavaScript

function downloadFile(uri, destinationFile) 
{
// Create a new download operation.
download = downloader.createDownload(uri, newFile);
// Start the download and persist the promise to be able to cancel the download.
promise = download.startAsync().then(complete, error, progress);
}
                

C#

private async void DownloadFile(Uri source, StorageFile destinationFile)
{
BackgroundDownloader downloader = new BackgroundDownloader();
DownloadOperation download = downloader.CreateDownload(source, destinationFile);

// Attach progress and completion handlers.
await HandleDownloadAsync(download, true);
}
             

Este exemplo de código demonstra a anexação de manipuladores a um novo DownloadOperation antes de chamar o StartAsync para iniciar, de fato, o download. Esse mesmo método também é usado para anexar novamente os manipuladores chamando o AttachAsync durante a enumeração de operações de download, como explicado abaixo.

C#

private async Task HandleDownloadAsync(DownloadOperation download, bool start)
{
// Create progress callback
Progress<DownloadOperation> progressCallback = new Progress<DownloadOperation>(DownloadProgress);
// Create cancellation token
CancellationTokenSource cts = new CancellationTokenSource();

if (start)
{
// Start the download and attach a progress handler.
await download.StartAsync().AsTask(cts.Token, progressCallback);
}
else
{
// The download was scheduled in a previous session, re-attach the progress handler.
await download.AttachAsync().AsTask(cts.Token, progressCallback);
}
}


Depois que um aplicativo iniciar uma operação de download em segundo plano, mesmo se for suspenso, essas operações de download continuam sendo executadas em segundo plano. Na próxima vez que o aplicativo for executado, você receberá os retornos e progresso e conclusão dessas operações de download. Se o aplicativo tiver sido terminado após ter sido suspenso, a enumeração das operações de download reiniciará as operações previamente enfileiradas. Os próximos exemplos de código mostram como enumerar as operações de download em C# e JavaScript

C#

// Enumerate downloads that were running in the background before the app was closed.
private async Task DiscoverActiveDownloadsAsync()
{
activeDownloads = new List<DownloadOperation>();

// Get all current download operations
IReadOnlyList<DownloadOperation> downloads = await BackgroundDownloader.GetCurrentDownloadsAsync();

if (downloads.Count > 0)
{
List<Task> tasks = new List<Task>();
foreach (DownloadOperation download in downloads)
{
// Attach progress and completion handlers.
tasks.Add(HandleDownloadAsync(download, false));
}

await Task.WhenAll(tasks);
}
}
               
JavaScript
function discoverActiveDownloads() 
{
// Enumerate outstanding downloads.
Windows.Networking.BackgroundTransfer.BackgroundDownloader.getCurrentDownloadsAsync().done
(function (downloads) {
// If downloads from previous app state exist, reassign callbacks and persist to global array.
for (var i = 0; i < downloads.size; i++) {
download[i].attachAsync().then(complete, error, progress);
}
}
}

As operações de download e carregamento estão sujeitas às mesmas restrições de recursos que as outras tarefas em segundo plano explicadas na próxima postagem desta série. Para saber mais sobre o BackgroundTransfer, consulte a visão geral de transferindo dados em segundo plano, namespace da API, Exemplo de download de transferências em segundo plano , ou assista a sessão //BUILD Tornando os aplicativos social e conectados a serviços HTTP.

Áudio em segundo plano

No Windows 8, facilitamos bastante o desenvolvimento de um aplicativo que reproduz áudio de forma simples e com eficiência no consumo de energia. O Windows 8 fornece controles de nível do sistema criados para melhorar a experiência do usuário no classe MediaControl, usando a categorização de fluxo e controles de transporte de mídia. Nesta seção, falaremos sobre como fazer seu aplicativo reproduzir áudio em segundo plano. Não entraremos em detalhes sobre a reprodução real de áudio ou sobre os classes de Controle de Mídia. Para obter mais informações sobre as tecnologias de áudio, consulte o white paper Reprodução de Áudio em um aplicativo estilo Metro.

Há três requisitos importantes que precisam ser atendidos pelo aplicativo para a reprodução de áudio em segundo plano:

  • Uma declaração de áudio em segundo plano deve ser feita no manifesto do aplicativo.
  • Defina a categoria de fluxo (msAudioCategory) para Comunicações ou BackgroundCapableMedia.
  • O aplicativo deve estar registrado para controles de transporte de mídia.

Para adicionar a declaração de áudio em segundo plano ao seu aplicativo, basta abrir o manifesto do aplicativo no Visual Studio. Na guia Declarações, selecione Tarefas em segundo plano no menu suspenso de declarações e adicione ao manifesto. Nos tipos de tarefa com suporte, selecione Áudio e especifique a página inicial do aplicativo JavaScript ou o ponto de entrada se o aplicativo for C#, C++ ou VB.

Declarações do manifesto no Visual Studio

O método mais fácil de reproduzir áudio é por meio do elemento <áudio> HTML5. A adição de um atributo msAudioCategory ao elemento <audio> permite que o sistema otimize o desempenho e melhore a experiência do usuário para o áudio do aplicativo. Por exemplo, essa adição permite o uso de mecanismos de reprodução com menos energia quando possível, permitindo que determinados sons sejam reproduzidos enquanto o aplicativo ainda está em segundo plano ou, em alguns casos, diminuindo o volume ou silenciando alguns sons para garantir que outros sejam ouvidos com clareza.

Este é o código HTML de exemplo para reproduzir áudio e configurar sua categoria de áudio de forma adequada.

<audio msAudioCategory="BackgroundCapableMedia" controls="controls"> 
<source src="song.mp3"/>
</audio>

Este é o código JavaScript para executar a mesma funcionalidade. Configure o atributo msAudioCategory antes de definir o elemento de fonte ou o sistema não visualizará a categoria de áudio.

JavaScript
function PlayAudio () 
{
// Create new audio tag for "BackgroundCapableMedia" class
if(!audtag)
{
audtag = document.createElement('audio');
audtag.setAttribute("id", "audtag");
audtag.setAttribute("controls", "true");
audtag.setAttribute("msAudioCategory", "backgroundcapablemedia");
audtag.setAttribute("src", "song.mp3");
document.getElementById("scenario1Output").appendChild(audtag);
audtag.load();
}
}
        

Este é um código C# de exemplo para definir a categoria de áudio em um fluxo de áudio de saída. A função SelectFile é usada para selecionar um arquivo usando FileOpenPicker e, depois, você configura AudioCategory no fluxo selecionado chamando SetAudioCategory.

C#
public async void SelectFile()
{
// Choose file using the picker
Windows.Storage.Pickers.FileOpenPicker picker = new Windows.Storage.Pickers.FileOpenPicker();
picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.MusicLibrary;

// Add a filter so only mp3 files are displayed
picker.FileTypeFilter.Add(".mp3");
Windows.Storage.StorageFile file = await picker.PickSingleFileAsync();
if (file != null)
{
var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
OutputMedia.AutoPlay = false;

// Run on the UI thread because it updates UI controls
await cw.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
OutputMedia.SetSource(stream, file.ContentType);
});
}
}

// Set the audio category on the output stream
public void SetAudioCategory(AudioCategory category)
{
OutputMedia.AudioCategory = category;
}
      

Existem duas categorias de áudio capazes de execução em segundo plano (ou seja, que permitem que seu aplicativo reproduza áudio em segundo plano): BackgroundCapableMedia e Comunicações. Dependendo do tipo de fluxo de áudio reproduzido, selecione a categoria de áudio adequada para que o sistema possa escolher as melhores características de desempenho para o fluxo de áudio.

Tipo de fluxo de áudio

Descrição

BackgroundCapableMedia

Para o áudio que precisa continuar sendo reproduzido em segundo plano. Exemplos:

· Reprodução de mídia local:

· Lista de reprodução local

· Rádio de streaming

· Lista de reprodução de streaming

· Vídeos musicais

· Áudio/rádio de streaming, YouTube, Netflix e assim por diante

Comunicações

Para comunicação de streaming de áudio, como:

· Voice over IP (VoIP)

· Conversa em tempo real ou outro tipo de chamada telefônica

Um aplicativo estilo Metro do Windows 8 é exibido em tela inteira, o que significa que se um usuário do seu aplicativo estiver ouvindo a música em segundo plano, não haverá uma maneira rápida de interromper a música sem registro para os controles de transporte. Os controles de transporte do sistema aparecem na tela se o aplicativo tiver feito o registro para eles e o usuário pressionar um dos botões de volume do hardware. Para obter mais informações sobre como adicionar controles de transporte de mídia ao seu aplicativo estilo Metro, consulte Guia do desenvolvedor sobre controles de transporte do sistema.

E é isso. Agora seu aplicativo pode reproduzir áudio em segundo plano sem ser suspenso. Mas como a reprodução de áudio em segundo plano deixa o aplicativo ativo, você tem a responsabilidade de garantir que ele não acabe com o desempenho do sistema ou com a vida útil da bateria. Assim que o aplicativo parar de reproduzir áudio, o Windows o suspenderá. Encontre informações mais detalhadas no white paper Reprodução de áudio em um aplicativo estilo Metro.

Resumo

Com isso, terminamos a primeira parte da nossa série sobre como ser produtivo em segundo plano. Nesta postagem, você aprendeu como reproduzir áudio em segundo plano e executar carregamentos ou downloads em segundo plano enquanto o aplicativo está suspenso. Na próxima parte, você aprenderá a escrever seu próprio código para fornecer funcionalidade em segundo plano enquanto o aplicativo está suspenso, usando tarefas de segundo plano.

-- Hari Pulapaka
    Gerente de programas, Windows

Recursos

Link

Tipo

Destaques

Transferindo dados em segundo plano

Início rápido

Documentação conceitual sobre a transferência em segundo plano

Namespace da API

Documentos de API

Namespace da API de transferência em segundo plano

Exemplo de download de transferência em segundo plano

Exemplo de projeto

Exemplo de aplicativo demonstrando o uso da API de transferência em segundo plano

Tornando os aplicativos social e conectados a serviços HTTP

Sessão //BUILD

Sessão //BUILD descrevendo o processo de criação de aplicativos conectados

Reprodução de áudio em um aplicativo estilo Metro

White paper

Whitepaper sobre como reproduzir áudio em segundo plano

Guia do desenvolvedor sobre controles de transporte do sistema

White paper

Whitepaper sobre o uso de controles de transporte de mídia para desenvolver aplicativos de música

Namespace da API

Documentos de API

APIs básicas de suporte à mídia