Padrão de design para ação alternativa se o aplicativo estiver em primeiro plano?

StackOverflow https://stackoverflow.com//questions/22001844

  •  20-12-2019
  •  | 
  •  

Pergunta

Estou construindo uma ação que utiliza o Google Cloud Messaging para receber notificações push.

Isso envolve alguns componentes notáveis, a saber:

  • A WakefulBroadcastReceiver para receber a mensagem do GCM.
  • Um IntentService para ser notificado quando um evento GCM for recebido.

Como tenho certeza de que é o caso de muitos aplicativos, gostaria de adotar uma abordagem diferente para quando o aplicativo tiver uma atividade em primeiro plano versus uma atividade em primeiro plano.quando o aplicativo faz não tem um aplicativo em primeiro plano.

Gostaria de postar uma notificação na gaveta de notificações se o aplicativo não estiver ativo e simplesmente encaminhar o evento para a atividade em primeiro plano se o aplicativo estiver ativo.

Existe um padrão de design para isso?Como devo determinar se o aplicativo está em primeiro plano ou em primeiro plano?o fundo?

Foi útil?

Solução

Você pode seguir uma abordagem conforme descrito em esta postagem do blog onde você cria um BroadcastReceiver na tua Activity com uma prioridade positiva (ou seja, superior ao padrão de 0) que intercepta uma ação específica e então chama abortBroadcast - isso trata do caso de abertura do aplicativo.Você também registra um BroadcastReceiver no seu manifesto, que lida com a mesma ação, mas com a prioridade padrão - esse é o substituto se o aplicativo não estiver aberto e criar a notificação do sistema.

Você então usa sendOrderedBroadcast() para enviar sua transmissão para todos os receptores registrados em ordem de prioridade.Se a atividade estiver aberta, o primeiro cuidará dela.Caso contrário, o padrão será o outro e criará uma notificação.

Outras dicas

A maneira que sugiro fazer isso é a seguinte.

Ter toda a lógica referente ao GCM em um Serviço (nunca usei IntentService, então não sei sobre sua coragem, mas vejo que herda de Service).

Na sua atividade provavelmente você tem uma forma de iniciar o serviço (talvez o usuário ative através de um botão), nada de novo aqui.

Aqui vem a parte divertida.Em sua atividade você lida onPause() e onResume().Em onResume() você vincular para o serviço.Com o mecanismo de vinculação você pode obter um ponteiro para o seu serviço e informar que você está lá "oi atendimento, sou uma atividade e estou aqui...por favor guarde um ponteiro para mim em algum lugar", e o serviço armazena um ponteiro para a atividade (vamos chamá-la mActivity).Na tua onPause() você notifica o serviço que está saindo, então o serviço define mActivity = null, e aí você desvincular do serviço.

Com este mecanismo, sempre que o Serviço recebe uma notificação push, ele testa o mActivity variável para ver se há uma atividade vinculada.Com um ponteiro para sua Activity você pode invocar qualquer um de seus métodos, encaminhar informações...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top