Windows Phone - Background Agents - Atualize o Tile de sua aplicação

Windows Phone - Background Agents - Atualize o Tile de sua aplicação

Pessoal, uma das dúvidas que mais ouço ultimamente tem relação com background agents. Nessa última semana respondi três questões sobre o tema e decidi escrever um post mostrando a base do processo e, espero, a partir daqui vocês podem utilizar para qualquer seja o problema que tiverem.

Antes de tudo, vamos a alguns bullet points importantes sobre o assunto:

  • Quando falamos em agentes de background, estamos falando da única forma de executar código seu sem que a aplicação propriamente dita não esteja sendo executada. Sim, a aplicação pode fazer download de arquivo, pode usar push notifications para atualizar tiles, enviar um toast, mas se estamos falando de código cliente customizado, está falando de background agents.
  • Quando usamos a palavra “BackgroundAgent” estamos nos referindo ao código que é executado propriamente dito. Teremos um projeto separado na nossa solução, que será compreendido por uma classe que deriva de um BackgroundAgent.
  • Para executar esse projeto/código, iremos criar uma “tarefa” no nosso código cliente (aplicação Windows Phone). Essa tarefa é o que chamamos de uma Scheduled Task.
  • Uma Scheduled Task no Windows Phone pode ser do tipo Periodic ou ResourceIntensive. Pontos importantes a lembrar: uma aplicação pode ter um e somente um BackgroundAgent registrado. Você pode registrá-lo como sendo uma Task periódica, intensiva ou os dois, mas apenas um agente pode ser adicionado.
  • A diferença entre periódico e intensivo é basicamente o quanto de recursos o telefone liberará para esse agente.
  • No PeriodicTask você tem código executando a cada trinta minutos, por no máximo 25 segundos.
  • Já no ResourceIntensiveTask podemos executar código por 10 minutos. Portanto, um bom cenário para uso da task intensiva seria sincronização de dados, por exemplo. Porém, apesar de poder executar por vários minutos, esse agente só executa se o seu celular estiver sendo carregado (conectado ao pc/tomada) e com uma conexão diferente da do seu plano de dados (WI-FI ou, novamente, conectado ao PC), entre outras coisas. Portanto, é importante saber o que quer e qual tipo de tarefa executará.
  • Por último, apesar de ser uma boa solução para diversos cenários, como o Live Tile que iremos mostrar (se torna mais fácil fazer o update assim do que ter um Push Notification, que exige código servidor), os Background Agents não funcionam nos novos celulares com 256 MB. Mais sobre isso em futuro artigo.

Vamos escrever um exemplo para que tudo isso fique claro?

Primeiro passo crie uma aplicação Windows Phone. Como nosso foco é apenas executar o código de background, não é necessário adicionar nenhum código nessa aplicação.

Na nossa aplicação Windows Phone, MainPage.xaml.cs, adicione duas propriedades:

  1: public partial class MainPage : PhoneApplicationPage

  2:     {

  3:         PeriodicTask periodicTask;

  4:         string taskNome = "Uma Task";

 

Na linha três estamos adicionando uma propriedade do tipo PeriodicTask (Microsoft.Phone.Scheduler.PeriodicTask) e uma string com um nome para a Task.

Após isso, iremos criar o método para registrar um agente. Esse método, em uma aplicação final, pode ser resultado de uma tela de configurações onde o usuário irá determinar se quer utilizar o Live Tile.

Aqui apresentamos o código do método diretamente. Fique livre para chamá-lo como resultado de um evento de checkbox ou da melhor forma que desejar registrar seu agente. Quando o usuário disparar a chamada a esse método, ele está aceitando que a aplicação começara a executar código em background. O código para registrar o Agente (ainda na aplicação Windows Phone) é o seguinte:

Código 1: Código para registrar o agente (inserido no projeto Windows Phone Application)

  1: void RegistrarAgente()
  2:         {
  3:             periodicTask = ScheduledActionService.Find(taskNome) as PeriodicTask;
  4: 
  5:             if (periodicTask != null)
  6:                 ScheduledActionService.Remove(taskNome);
  7: 
  8:             periodicTask = new PeriodicTask(taskNome);
  9: 
 10:             periodicTask.Description = "Uma Task de exemplo";
 11: 
 12:             try
 13:             {
 14:                 ScheduledActionService.Add(periodicTask);
 15: 
 16: #if(DEBUG_AGENT)
 17:                 ScheduledActionService.LaunchForTest(taskNome, TimeSpan.FromSeconds(60));
 18: #endif
 19:             }
 20:             catch (InvalidOperationException ex)
 21:             {
 22:                 //Bg agentes não habilitados  - exceções IO
 23:             }
 24:             catch (SchedulerServiceException)
 25:             {
 26:                 //ex de serviço
 27:             }
 28:         }
 
Na listagem, temos na linha 3 a busca por um Periodic Task com o nome requisitado. Esse Find, seguido do condicional na linha 5, estão validando se já temos um task cadastrado. Caso positivo, precisamos remover e o recadastrar (não há update de agentes).
Em resumo, das linhas 3 a 10 estamos criando um Periodic Task. Esse task, aliás, poderia ser do tipo ResourceIntensive. Como estamos só atualizando o Tile, então escolhemos do tipo periódico.
Lembrando que é necessário a descrição mostrada na linha 10, é essa string que irá aparecer na listagem de agentes no telefone (em settings/applications/background tasks).
 
Na linha 14 vamos adicionar nossa periodic task ao sistema, estamos fazendo o registro nesse momento.
 
Logo após isso, entre as linhas 16 a 18 é onde forçamos a execução do agente quando em modo debug. Notem que conseguimos executar o Agente a cada 60 segundos. Quando a aplicação estiver executando nos telefones, essa execução não é controlada pela aplicação, e sim pelo Windows Phone OS.
 
Esse é todo o código necessário em sua aplicação Windows Phone para o registro e execução de um agente. Ok, mas e onde está o código desse agente? Onde eu posso adicionar O QUE eu quero fazer?
 
É aí que a segunda parte do processo entra.
 
Indo até o Visual Studio, gere um novo projeto com o template Windows Phone Scheduled Task Agent, conforme Imagem abaixo. Esse será o código propriamente dito, que é executado após o registro que fizemos em nosso projeto anterior.

Gerando o projeto na sua solution, verá que um arquivo chamado ScheduledAgent.cs é criado.
No arquivo, procure o método “OnInvoke” que, bem comentado, já explica que é o processo executado quando o agente for ser executado (e inclusive um comentário “TODO” mostrando onde seu código deve ser adicionado).
 
Então, resumo até o momento: 

  • Uma aplicação Windows Phone que registra um agente.
  • O agente é executado pelo sistema operacional, em intervalos regulares.
  • No momento da execução, o código que será chamado é o método OnInvoke do arquivo ScheduledAgent.cs, localizado no projeto de template do tipo Windows Phone Scheduled Agent.

Ok, restando então adicionarmos o código ao método OnInvoke. E qual é o código que devemos adicionar?

Qualquer ação que desejarmos que seja executado!

No nosso exemplo vamos atualizar um Tile. Mas podemos muito bem, por exemplo, acessar o isolated storage, buscar algum dado e chamar um serviço para “subir” para a nuvem essa informação. Podemos executar alguma regra de negócio, sincronizar dados, etc. o código que vai dentro desse método é exatamente a regra de negócio que deseja executar em background, sem sua aplicação estar sendo utilizada pelo usuário.
 
No nosso exemplo, o método OnInvoke fica assim:

Código 2: Projeto Windows Phone Scheduled Agent, código que é executado quando o Agente é registrado e está pronto para rodar. 

  1:         protected override void OnInvoke(ScheduledTask task)

  2:         {

  3:             //TODO: Add code to perform your task in background

  4:             ShellTile TileToFind = ShellTile.ActiveTiles.First();

  5:

  6:             if (TileToFind != null)

  7:             {

  8:                 StandardTileData NewTileData = new StandardTileData

  9:                 {

 10:                     BackTitle = "TechNet Wiki",

 11:                     BackContent = "AGENTE EXECUTOU " + DateTime.Now.ToShortDateString()

 12:                 };

 13:                

 14:                 TileToFind.Update(NewTileData);

 15:             }

 16:

 17:             NotifyComplete();

 18:         }

 19:     }

 
Se notar o código acima é o código “comum” para atualização de um Tile principal. 
Saiba mais
Não entraremos no mérito de Tiles, mas para saber mais acesse a biblioteca oficial:
http://msdn.microsoft.com/en-us/library/hh202948(v=VS.92).aspx
E também o centro de treinamento MSDN
http://msdn.microsoft.com/pt-br/windowsphone/hh553530
 

Em resumo, o código inserido dentro do método OnInvoke é lido assim que o Agente for executado.
E isso, em nosso exemplo, ocorre uma vez a cada minuto.

Quando feito o deploy para o telefone, o mesmo ocorrerá uma vez a cada trinta minutos (no caso do Periodic).

Apenas notem o na linha 17 a chamada ao método NotifyComplete() , que irá informar ao sistema operacional que o agente terminou de executar seu código e que o sistema pode tomar controle novamente da ação.

Lembram que falamos sobre agentes não executarem nos novos celulares com 256 MB , como Lumia 610? Vamos fazer o teste executando primeiramente no emulador de 256MB, presente no sdk 7.1.1. Vejam o resultado na figura abaixo: 

O código é o da listagem 1 e mostra que, utilizando emulador de 256MB, ao chamarmos a linha 14 da listagem 1


14:                 ScheduledActionService.Add(periodicTask);

 

É gerada uma exceção.

Se executarmos o mesmo código em emulador 512MB tudo ocorre normalmente e o resultado está na imagem abaixo. Faça o debug linha a linha e perceba que iremos percorrer a listagem 1, registrando o agente e, após algum tempo, o código da listagem 2 é disparado (a cada 60 segs, conforme escolhemos), atualizando o tile.

Sobre Background Agents era isso. Espero que possam reutilizar a solução em diversas situações, como descritas, e tirar proveito de código sendo executado em background. Mas lembrem sempre de estudar Push Notifications e outras soluções como background transfer. Em breve devo comentar sobre isso também por aqui. 

Ver Também

Outro importante lugar onde pode encontrar uma enorme quantidade de artigos relacionados com Windows Phone é a própria TechNet Wiki. Onde o melhor ponto de entrada é Recursos Windows Phone no TechNet Wiki!
Classificar por: Data da Publicação | Mais Recente | Mais Úteis
Comentários
Página 1 de 1 (3 itens)