Aplicativo deve mandar informações a um sistema a cada X segundos. Como fazer?

Pessoal,

Estou desenvolvendo um aplicativo que precisa mandar informações a um sistema (por meio de webservice) a cada X segundos. Precisarei fazer uma rotina para enviar notificação a tal sistema ou existe algum tipo de serviço ou framework que possa usar?

Obrigado

A forma mais simples é com os Executors:

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html

Porém, se você estiver usando um servidor de aplicações, pode ser mais interessante você usar um EJB Timer Service:

https://docs.oracle.com/javaee/6/tutorial/doc/bnboy.html

Você também pode usar o Spring se não quiser usar um EJB pra isso (pode ser interessante caso você esteja acostumado a usar o Spring):

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html

Se não quiser utilizar o Spring, pode ir com o Quartz:

http://quartz-scheduler.org/

Em todo caso, você já deve ter percebido que não faz mais sentido manipular Threads na mão para fazer esse tipo de coisa, basta ter isso em mente e não reinventar a roda, pois já existe na API do Java (no caso dos executors) e já é coberto pelo JEE. Se não gostar deles, pode usar um framework como o Spring ou o Quartz.

Muito obrigado pela resposta.

Porém, preciso fazer isso de um aplicativo de celular.

Basicamente é: Tenho um sistema web e um aplicativo móvel. Através do sistema web deve ser possível saber se o celular, cujo aplicativo está instalado, está on-line ou não.

Já fez algo desse tipo ou conhece / propõe uma solução ou material de estudo?

Obrigado

Por que você precisa saber se o celular esta online a cada X segundos?

Senhores,

A primeira mensagem foi: Estou desenvolvendo um aplicativo que precisa mandar informações a um sistema (por meio de webservice) a cada X segundos.

Na segunda mensagem: Tenho um sistema web e um aplicativo móvel. Através do sistema web deve ser possível saber se o celular, cujo aplicativo está instalado, está on-line ou não.

Como o sistema web, quando solicitado, poderia saber se o aplicativo móvel está on-line?
1 - O aplicativo móvel poderia enviar notificações a cada X segundos ao servidor informando que está on-line?
2 - O sistema web, por meio de algum tipo de serviço / framework, poderia saber se o aplicativo móvel está on-line?

Poderia usar o serviço de notificação Push, para isso preciso enviar uma notificação ao celular para saber se ele está on-line. O problema é que o celular receberá uma notificação sem fundamento algum, somente por conta de uma consulta.

Será que consegui explicar direito agora? :slight_smile: :slight_smile: :slight_smile:

Obrigado

Continuo sem entender o que você quer fazer.

Tenta explicar o problema, porque até agora você só falou de soluções.

Cenário:
1 Aplicativo móvel instalado no celular (Android)
1 Sistema web que tem um dos requisitos verificar se o aplicativo móvel está on-line ou não

Obs: Para aplicativo ficar on-line o usuário deve primeiramente abrí-lo e mesmo fechando-o, o aplicativo deve ficar on-line até que o celular seja despligado ou fique sem rede.

Dada as situações, quais são as formas possíveis do sistema web saber se o aplicativo móvel está on-line?

Dúvida:
O aplicativo móvel deve enviar informações ao sistema web informando que está on-line?
O sistema web consegue acessar algum serviço para saber se o aplicativo está on-line?
Existe outra coisa?

Att

1 é possível, mas geralmente quando o aplicativo é fechado ele é encerrado, não tem como ficar conectando em segundo plano.

Você precisa, nesse caso, usar um Service em vez de Activity. Na verdade o aplicativo não é encerrado de fato (a menos que você marque essa opção nas preferências de desenvolvedor do dispositivo), ele continua em memória, mas não terá processamento (se usar um cronômetro, por exemplo, ele ficará inativo quando sair da aplicação).

Eu acabei nem percebendo que o aplicativo em questão era para um dispositivo Android. Nesse caso, aquelas bobagens que disse na primeira mensagem não são aplicáveis a esse caso, provavelmente o ideal seria usar um ScheduledExecutorService para enviar as informações:

http://developer.android.com/reference/java/util/concurrent/ScheduledExecutorService.html

Nesses casos normalmente você notifica que está on-line, após a abertura do app e no final do app (encerramento do Service) notifica que estará encerrando o app.
Note que isso não é uma garantia absoluta, pois, o app pode estar ativo mas sem conexão, ou o dispositivo pode ser desligado após avisar que está on-line.
Caso seja necessário enviar dados periódicos para o sistema web o recurso do Android recomendado é o uso do alarme (classe AlarmManager). Veja que nesse caso o seu app não precisa estar em execução, o sistema Android vai executar determinadas ações de acordo com o programado.

Obrigado senhores.

Vou começar as pesquisas.

Na verdade você pode e provavelmente ira utilizar uma mescla de alguns serviços que o pessoal comentou acima.

  • AlarmManager
  • Service
  • Provavelmente o BroadCastReceiver

Uma dica boa é você configurar um BroadcastReceiver para quando o celular for ligado o sistema executar novamente o seu service.

O AlarmManager é uma boa dica e inclusive voce pode utilizar ele em conjunto com o Service (ou o “IntentService” que em resumo são parecidos) para executar a sua ação em background mesmo que a sua app não esteja sendo exibida na tela do device.

Também acho que o melhor jeito é o que o lucas93lange falou… AlarmManager + Service + broadcastreceiver (pra executar quando o aparelho é ligado).

Pensando no seu cenário, eu faria da seguinte maneira…
com o alarmmanager executando o service em um periodo de, sei lá, 5 a 10 minutos, registraria o horário no seu servidor… No servidor eu trataria fazendo uma verificação da data/hora atual subtraido uns 2 ou 3 minutos a mais do que foi programado no app. Se o ultimo horário registrado for maior que essa data subtraida com os minutos a mais, significa que está “online”… se não, offline.

Exemplo:
app configurado pra mandar de 7 em 7 minutos;
webservice: se UltimaDataHoraDoApp >= (DataHotaAtual() - 10 minutos) entao online… se não, offline…

entendeu?

acho que fica inviável vc tentar acessar o celular através do seu webservice, sei la…