locked
É possível ficar rodando serviço em background e atualizar o tiles? RRS feed

  • Pergunta

  • Pessoal, tenho uma aplicação que ao abrir eu chamo um recurso do celular usando o  connectionSettingsTask.Show();

    Sendo que ao chamar este serviço eu preciso fechar a aplicação e ativar um serviço em background que fica atualizando as informações do meu Tiles.

    Alguém pode me ajudar? 

    quinta-feira, 3 de novembro de 2011 23:48

Respostas

  • Paulo,

     

    Desde a versão 7.1(Mango) do sdk, temos alguns recursos que podem te ajudar.

     

    Sobre o que comentou de Live Tiles, não era possível anteriormente atualizá-los através de código local, somente push notifications.

    Agora temos uma API local e pode atualizar com códigos do tipo desse meu exemplo aqui, que peguei de uma app minha

                ShellTile tile = ShellTile.ActiveTiles.First();

     

                StandardTileData tileData = new StandardTileData

                {

                    Title = "TÍTULO",

                    Count = 1,

                    BackgroundImage = new Uri("/Imagens/front.png",UriKind.Relative),

                    BackContent = "Novidade chegando",

                    BackTitle = "WP7"

                };

     

                tile.Update(tileData);

     

    Sobre executar serviços, agora é possível executar ações através dos Background Agents, sem que sua aplicação esteja sendo executada pelo usuário, mas somente em dois cenários.

     

    O primeiro, caso seja por um curto período de tempo e poucos dados, é utilizar o Periodic Task. Não há requisições maiores para isso, a não ser o usuário liberar (sempre é possível desabilitar via settings do telefone).

     

    O segundo, caso necessite de um longo período de tempo ou uma sincronização de dados alta, seria usar o Resource Intensive Task, que te dará mais recursos, por mais tempo, porém só executa sob certas condições, por exemplo o celular estar sendo carregado, estar conectado em uma rede, etc... (tudo pensando na boa experiência do usuário e em jamais deixar uma aplicação “escondida” matar a bateria)

     

    Precisando de mais algo me avisa. Vou falar mais sobre isso nos próximos dias, é um assunto que me interesso bastante.

     

    Um bom link é a biblioteca do MSDN, com explicação de como os agentes funcionam

    http://msdn.microsoft.com/en-us/library/hh202942(v=VS.92).aspx

     


    Rodolpho Marques do Carmo Microsoft Certified Professional Windows Phone 7 Development
    • Marcado como Resposta Thiago Monaco sexta-feira, 4 de novembro de 2011 11:37
    sexta-feira, 4 de novembro de 2011 10:50

Todas as Respostas

  • Paulo,

     

    Desde a versão 7.1(Mango) do sdk, temos alguns recursos que podem te ajudar.

     

    Sobre o que comentou de Live Tiles, não era possível anteriormente atualizá-los através de código local, somente push notifications.

    Agora temos uma API local e pode atualizar com códigos do tipo desse meu exemplo aqui, que peguei de uma app minha

                ShellTile tile = ShellTile.ActiveTiles.First();

     

                StandardTileData tileData = new StandardTileData

                {

                    Title = "TÍTULO",

                    Count = 1,

                    BackgroundImage = new Uri("/Imagens/front.png",UriKind.Relative),

                    BackContent = "Novidade chegando",

                    BackTitle = "WP7"

                };

     

                tile.Update(tileData);

     

    Sobre executar serviços, agora é possível executar ações através dos Background Agents, sem que sua aplicação esteja sendo executada pelo usuário, mas somente em dois cenários.

     

    O primeiro, caso seja por um curto período de tempo e poucos dados, é utilizar o Periodic Task. Não há requisições maiores para isso, a não ser o usuário liberar (sempre é possível desabilitar via settings do telefone).

     

    O segundo, caso necessite de um longo período de tempo ou uma sincronização de dados alta, seria usar o Resource Intensive Task, que te dará mais recursos, por mais tempo, porém só executa sob certas condições, por exemplo o celular estar sendo carregado, estar conectado em uma rede, etc... (tudo pensando na boa experiência do usuário e em jamais deixar uma aplicação “escondida” matar a bateria)

     

    Precisando de mais algo me avisa. Vou falar mais sobre isso nos próximos dias, é um assunto que me interesso bastante.

     

    Um bom link é a biblioteca do MSDN, com explicação de como os agentes funcionam

    http://msdn.microsoft.com/en-us/library/hh202942(v=VS.92).aspx

     


    Rodolpho Marques do Carmo Microsoft Certified Professional Windows Phone 7 Development
    • Marcado como Resposta Thiago Monaco sexta-feira, 4 de novembro de 2011 11:37
    sexta-feira, 4 de novembro de 2011 10:50
  • Com relação a atualizar o Tiles eu já aprendi a fazer, a minha dificuldade foi implementar o Agent que fica rodando em background. O que eu preciso fazer de fato é deixar algo rodando em background verificando o status da minha rede wi-fi.

    Se não for muito incomodo teria como montar um exemplo?

    Eu já achei alguns exemplos na internet mais não tive muito sucesso ao implementar.

    Desde já agreço pela ajuda!

    sexta-feira, 4 de novembro de 2011 12:21
  • Claro Paulo,

     

    faz assim, dá uma boa estudada no link que te passei e veja esse aqui
    http://msdn.microsoft.com/en-us/library/hh202941(v=VS.92).aspx 
    que te mostra como implementar os agentes

     

    e também os code samples, tem um BEM bacana
    http://msdn.microsoft.com/en-us/library/ff431744(v=VS.92).aspx#BKMK_Background

     

    em breve, se tudo der certo, vamos ter algum vídeo no centro de treinamento para falar disso.

     

    Agora, tentando deixar um pouco mais claro, sem me alongar muito, funciona assim. Você vai ter um agente registrado na sua app, que nada mais vai ser do que uma chamada na sua mainPage a algo tipo

    PeriodicTask ASuaTask = new Periodic...

     

    você precisa usar uma descrição par a sua task (que vai aparecer para o usuário nos settings do telefone) e vai fazer um override no

    OnInvoke com a scheduled task como parametro e adicionar o código que desejar executar na sua task. Não se preocupe pois o sistema cuida de  quanto ele pode chamar sua task.

    É simples assim : )

     


    Rodolpho Marques do Carmo Microsoft Certified Professional Windows Phone 7 Development
    sexta-feira, 4 de novembro de 2011 12:39
  • O problema que estou tentando é na hora de atualizar o tiles, pois a propriedade .ActiveTiles.First(); não existe dentro do método
    protected override void OnInvoke(ScheduledTask task) 

     

     

                ShellTile tile = ShellTile.ActiveTiles.First();

     

                int segundo = DateTime.Now.Second;

     

                StandardTileData tileData = new StandardTileData

                {

                    Title = "TÍTULO",

                    Count = segundo,

                    //BackgroundImage = new Uri("/Imagens/front.png", UriKind.Relative),

                    BackContent = "Novidade chegando",

                    BackTitle = "WP7"

                };

     

                tile.Update(tileData);

     

     

     

     

                // Call NotifyComplete to let the system know the agent is done working.

                NotifyComplete();

    sexta-feira, 4 de novembro de 2011 23:30
  • Segue parte do código de meu Agent

    protected override void OnInvoke(ScheduledTask task)
            {
    
                AtualizaTile();
                NotifyComplete();
            }
    
    
            private void AtualizaTile()
            {
                string texto = "";
                string title = "";
    
    
                if (DeviceNetworkInformation.IsWiFiEnabled == true)
                {
                    texto = "Wi-fi conectado";
                    title = "Conectado";
                }
                else
                {
                    texto = "Wi-fi desconectado";
                    title = "Desconectado";
                }
    
                
                var meuTile = ShellTile.ActiveTiles.First();
                var standardTile = new StandardTileData
                {
                    Title = title,
                    //BackgroundImage = new Uri("arroba.png", UriKind.Relative),
                    Count = 0,
                    BackTitle = "",
                    BackContent = texto
                    //BackBackgroundImage = new Uri("arroba_back.png", UriKind.Relative)
                };
                meuTile.Update(standardTile);
    
                
    
    
    
    
                
    
    
            }
    

     
    sexta-feira, 4 de novembro de 2011 23:44
  • Olha só, rapidão eu dei uma olhada no seu código e , de cara, algo que vejo que não iria funcionar é pelo fato do seu Tile estar tentando fazer update em algo que não está sendo executado na thread UI (note, seu evento de agent executa em background..)

    no caso, você vai precisar do Dispacther.BeginInvoke.

     

    se precisar de exemplos passo a passo sobre isso procure também por livetile com backgroundagents que vai achar coisas interessantes... e como mencionei na própria biblioteca tem uns code samples interessantes.


    Rodolpho Marques do Carmo Microsoft Certified Professional Windows Phone 7 Development
    sábado, 5 de novembro de 2011 16:48