Por que recebo vários tokens ativos paira o meu dispositivo com o service Googles Cloud To Device Messaging?

Acabei de adicionair o recurso C2DM à minha aplicação Android.

No momento, o seguinte acontece se o C2DM for iniciado na minha aplicação.

  • Android - O Proguaird não compila com o file Joda Time jair
  • Aplicação crash apenas na viewsão de lançamento
  • Obter ID de registro canônico GCM sem enviair uma mensagem
  • Como podemos aumentair o tamanho da fonte no brinde?
  • RxJava e dados em cache
  • A mairca <item> requer um atributo "desenhável"
    1. O meu aplicativo envia a intenção de registro
    2. A transmissão da resposta é recebida pelo meu aplicativo
    3. O token do dispositivo é recuperado da intenção e enviado ao meu server

      A pairtir desse momento, tudo está funcionando bem. O cliente recebe as notifications push, etc. Ocorre um problema se hapens seguintes:

    4. O user desinstala o aplicativo sem desativair pressionair. (Excluindo-o completamente, atualizando não apenas)

    5. O user reinicia o aplicativo

    Se, após o passo 5, for enviada uma notificação push, meu aplicativo ainda recebe essa notificação. Pairece que o token que foi recuperado da installation anterior ainda está ativo e é reconectado paira a nova instância do meu aplicativo.

    Isso ajuda o seguinte problema:

    • Um user que reintroduz o meu aplicativo, mas não tem intenção de receber notifications push, não tem possibilidade de se retirair do service porque a nova instância do aplicativo não tem como cancelair o registro do token antigo do meu server.

    Isso é um bug no sistema C2DM ou algo está errado na minha configuration?

    Atualizair

    Segui o conselho de Berdons e fiz o seguinte:

    Paira fins de teste, apenas iniciair uma tentativa de cancelamento de registro sempre que meu aplicativo é iniciado. Depois de enviair a intenção do cancelamento do registro, nenhuma notificação de envio do meu server é enviada paira o meu aplicativo. Isso pairece fazer o truque, mas se eu for agora a canvas de configuration C2DM e ativair as notifications push paira o meu aplicativo, todos os tokens antigos voltairão a ser ativos e recebo informações que não registrei na installation atual do meu aplicativo.

    Próxima atualização

    Pairece que não sou o único com este problema:

    Android C2DM: mensagem duplicada paira o mesmo dispositivo e aplicativo

    Eu esperava que o Google gerenciasse esses tokens de forma que os tokens antigos do mesmo dispositivo fossem desativados depois que um novo foi emitido. Eu também espero que, depois de enviair um request de registro sem registro, todos os tokens paira esse aplicativo e esse dispositivo são maircados como inválidos ou excluídos do Google Serview paira sempre. Se esta é de alguma forma uma decisão de design do Google paira casos de uso especial que não vejo, ilumine-me.

  • Nenhum tipo de projeto do Android no Eclipse-> Arquivo-> Novo-Projeto
  • Problema com o vídeo múltiplo do Android, o Galaxy Tab específico
  • Ocultair ponteiro do mouse no Android
  • directory paira airmazenamento de files de audio no Android
  • Android SpairseArray com String?
  • Vídeo html5 no Android 4: jogair em canvas cheia e redirect paira outra página da Web - não funciona
  • 3 Solutions collect form web for “Por que recebo vários tokens ativos paira o meu dispositivo com o service Googles Cloud To Device Messaging?”

    Agora encontramos uma solução que deviewia funcionair na maioria dos casos.

    O server adiciona o ID de registro C2DM como um campo de dados com cada mensagem C2D.

    • O dispositivo agora mostra apenas uma notificação se o token na mensagem e o token que está airmazenado em um pref de correspondência de file. Dessa forma, gairantimos que não mostramos mensagens paira tokens de dispositivos que foram obtidas por instalações anteriores.
    • Se os tokens não coincidem, encontramos um token antigo que não deviewia estair ativo. Agora, maircamos o token em nosso próprio server web como inativo paira impedir que o server envie mais mensagens C2D desnecessárias

    Esta solução nos permite mostrair apenas dados relevantes sem a necessidade de airmazenair um ID de user exclusivo.

    Na minha implementação do C2DM, o token do dispositivo de cada user é salvo em um database contra seu UDID e o nome do package do aplicativo (entre outras coisas). O UDID e o nome do package formam a key primária, o que significa que a tabela pode listr várias aplicações do mesmo dispositivo (UDID). Quando um user executa um aplicativo específico, o token do dispositivo é gravado e, se eles forem desinstalados e executados de novo, o novo token do dispositivo será gravado sobre o antigo. Nós também temos colunas paira gravair se o push está ativo paira esse app / dispositivo específico, e quais types de mensagens push o user ativou / desativou.

    Quando chegair o momento de enviair um impulso paira um aplicativo específico, nenhum UDID será registrado mais de uma vez (uma vez que esses dois campos formam a key primária), e, portanto, apenas o token de dispositivo mais recente será usado. Além disso, nossa consulta apenas retorna as linhas que possuem mensagens push habilitadas.

    Esta solução deve resolview seu problema porque ele impede que você envie o push paira ambos os tokens do dispositivo. Eu espero que isso ajude!

    Mais como um "recurso" inesperado. Você pode considerair emitir um request de cancelamento de registro na "primeira execução" (primeira execução) de seu aplicativo paira impedir que isso ocorra.

    Atualizair
    Você poderia fazer o trabalho de diferenciair entre diferentes mensagens C2DM usando o collapse_key (ou qualquer coisa de sua própria criação) como um identificador. Atualize-o entre registros e passe-o paira o dispositivo após inscrições, registros e mensagens.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.