AlarmManager no Android, Sua APP Executando Em Tempos Definidos

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes! Você receberá um email de confirmação. Somente depois de confirma-lo é que eu poderei lhe enviar os conteúdos semanais exclusivos. Os artigos em PDF são entregues somente para os inscritos na lista.

Email inválido.
Blog /Android /AlarmManager no Android, Sua APP Executando Em Tempos Definidos

AlarmManager no Android, Sua APP Executando Em Tempos Definidos

Vinícius Thiengo
(17272) (51)
Go-ahead
"O método consciente de tentativa e erro é mais bem-sucedido que o planejamento de um gênio isolado."
Peter Skillman
Prototipagem Android
Capa do curso Prototipagem Profissional de Aplicativos
TítuloAndroid: Prototipagem Profissional de Aplicativos
CategoriasAndroid, Design, Protótipo
AutorVinícius Thiengo
Vídeo aulas186
Tempo15 horas
ExercíciosSim
CertificadoSim
Acessar Curso
Quer aprender a programar para Android? Acesse abaixo o curso gratuito no Blog.
Lendo
TítuloDomain-driven Design Destilado
CategoriaEngenharia de Software
Autor(es)Vaughn Vernon
EditoraAlta Books
Edição
Ano2024
Páginas160
Conteúdo Exclusivo
Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba gratuitamente conteúdos Android sem precedentes!
Email inválido

Tudo bem?

No vídeo acima é apresentada uma maneira de como gerar alarmes no Android utilizando a classe AlarmManager e outros componentes complementares, para uma tarefa de alarme bem sucedida.

Note que o foco de apresentação da AlarmManager no vídeo não é no contexto de "alarmes de relógios", algo já oferecido pelos dispositivos móveis com o sistema Android e também possível com a AlarmManager.

O foco do projeto em vídeo é no contexto de "alarmes que vão permitir que uma aplicação Android realize alguma tarefa em background", isso, tarefa em background, sem o conhecimento do usuário e sem a necessidade de o aplicativo estar aberto, em primeiro plano (foreground).

Alias, o trabalho com AlarmManager no background é uma das maneiras de permitir que nós desenvolvedores possamos, por meio de atualizações no servidor Web e com o auxílio de notificações push, notificar os usuários de nossos aplicativos quando algo novo ou importante estiver disponível.

No vídeo acima foram utilizadas também as classes BroadcastReceiverNotification para dar mais ênfase sobre como a classe AlarmManager é comumente utilizada.

Fique atento quanto ao método cancel() de AlarmManager, pois, como falo no vídeo, liberar recursos é extremamente importante no sistema Android devido a limitação de memória que os aplicativos têm - ajuda a evitar vazamento de memória e o temido OutOfMemoryException.

Sobre o conteúdo do vídeo eu termino por aqui, mas é de extrema importância que você desenvolvedor Android, independente de seu nível, estude por completo o tópico Execuções em background no Android logo abaixo.

Antes de finalizar deixo alguns bons links de outros artigos aqui do Blog, com vídeos, que lhe colocarão em dia com o que há de novo no desenvolvimento de aplicativos Android:

E caso você tenha o desejo de aprender a desenvolver apps Android, ou apenas evoluir nesta área, também com os conteúdos gratuitos do Blog, então não deixe de acessar a lista de estudos em: Estudando Android - Lista de Conteúdos do Blog.

E também não esqueça de se inscrever 📫 na lista de e-mails do Blog para receber os conteúdos de desenvolvimento Android em primeira mão... e também as versões em PDF desses conteúdos (versões em PDF são liberadas somente aos inscritos da lista de e-mails).

Se inscreva também no canal do Blog no YouTube para acompanhar as últimas novidades disponibilizadas em vídeo.

Surgindo dúvidas ou dicas, pode enviar abaixo na área de comentários que logo eu lhe retorno.

Obs. : o link para download do projeto apresentado em vídeo se encontra logo abaixo no artigo, na seção "Download".

Execuções em background no Android

É muito importante você saber que na época em que este artigo e o vídeo foram construídos as regras de negócio no Android, em relação a segurança de dados e em relação ao tempo de vida da bateria do aparelho, eram bem menos críticas do que são atualmente.

Ok, Thiengo. Mas por que você está me informando isso?

Porque desde a versão 6 do Android, também conhecida como Android Marshmallow, a execução de tarefas em background não é nada simples, é preciso, como melhor estratégia, adaptar os algoritmos do aplicativo, aqueles que têm de executar em background, às regras de execução em segundo plano.

Alguns desenvolvedores tentam "forçar" alguma maneira para conseguir continuar com execuções em background nos tempos estipulados em fase de projeto, por exemplo: execuções de 5 em 5 minutos.

Mesmo que você consiga isso, você está assumindo um risco grande em seu app, pois ele pode ser removido tanto dos aparelhos em que está instalado como também da Google Play Store.

Mas por que?

Porque certamente essa execução de 5 em 5 minutos estará consumindo consideravelmente a bateria de aparelhos Android, algo que hoje, nas regras de negócio deste sistema operacional, é inadmissível.

Para você conseguir uma melhor estratégia e adequação de seu aplicativo Android a execuções em background, eu fortemente recomendo que você destrinche os links a seguir:

Todos os links indicados são da documentação oficial e os dois primeiros e mais importantes estão em português do Brasil.

Abraço.

Eclipse IDE vs Android Studio IDE

Apesar de o conteúdo da vídeo aula acima estar utilizando o Eclipse IDE 😱, tudo que é apresentado, tanto a parte teórica quanto a parte prática, é ainda válido nos dias de hoje com o desenvolvimento Android utilizando o Android Studio 😁.

Ou seja, independente da linguagem oficial (Java, Kotlin, C ou C++), IDE ou framework que você esteja utilizando, o conteúdo acima é ainda muito útil.

AndroidX

Apesar do conteúdo sobre a API AlarmManager ainda estar atual e ser importante para qualquer nível de desenvolvedor Android.

Apesar disso eu também recomendo, assim que finalizado o projeto em sua própria instalação de IDE, que você o migre para o AndroidX.

Algo que pode ser feito com poucos cliques, como apresentado no tutorial a seguir: Migrar para o AndroidX.

Fontes

AlarmManager - documentação oficial Android

Schedule repeating alarms

TimeManager - documentação oficial Android

Classe Intent e o Conceito de Pilha em Android

Service no Android, Entendendo e Utilizando

APIs para processamento em background, Android-Arsenal

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes!
Email inválido

Relacionado

Monitorando Sua APP Android Com Google AnalyticsMonitorando Sua APP Android Com Google AnalyticsAndroid
Monetizando Sua APP Com o Google AdMob (Anúncios Mobile)Monetizando Sua APP Com o Google AdMob (Anúncios Mobile)Android
9-Patch no Android, Mantendo a Qualidade de Imagens de Background9-Patch no Android, Mantendo a Qualidade de Imagens de BackgroundAndroid
Notification no Android, Criando Notificações Com Toque e VibraçãoNotification no Android, Criando Notificações Com Toque e VibraçãoAndroid

Compartilhar

Comentários Facebook

Comentários Blog (51)

Para código / script, coloque entre [code] e [/code] para receber marcação especifica.
Forneça seu nome válido.
Forneça seu email válido.
Forneça o comentário.
Enviando, aguarde...
14/03/2019
Boa Noite Thiengo,
Estou aprendendo a desenvolver Android e vc tem me ajudado bastante.
Estou testando este Projeto no Android 8.1 e apesar de escrever no Log de que o Alarme foi iniciado, as mensagens de Log no BroadCast não aparecem em tempo de execução.
Reiniciei o APP e a mensagem é que o Alarme esta ativo, porém as mensagens do BroadCast nao aparecem.
Usei o Debug, e App não esta passando pela classe BroadCast, não sei se fiz algo errado, não vi nada errado, mas não funciona.
Estou testando em aparelho físico e como dito acima com android 8.1.
Responder
Vinícius Thiengo (0) (0)
08/04/2019
Julio, tudo bem?

A principio a limitação está no Android Oreo, dê uma olhada na solução do link a seguir:

https://stackoverflow.com/a/45825690/2578331

Certamente ela será útil a ti também.

Abraço.
Responder
22/06/2018
Vinicius, eu consigo com meu app criar um alarme no app de relógio do android?
Responder
Vinícius Thiengo (0) (0)
22/06/2018
Lucas, tudo bem?

A comunicação com outros aplicativos é por meio de Intent ou por ContentProvider. Verifique se na documentação do aplicativo que você deseja criar o alarme (por meio de seu app) há essa possibilidade.

Digo isso, pois essa é uma particularidade do aplicativo, os desenvolvedores permitem a comunicação com o app deles somente se quiserem isso como funcionalidade do aplicativo.

Abraço.
Responder
wesley (1) (0)
04/06/2018
eu poso fazer um alarme completo com o usuário digitando a hora que quer que desperte e após isso o alarme despertar de tempos em tempos com o intervalo entre eles informado pelo usuário também? presciso disso pro meu tcc, me da uma luz aee kkk
Responder
Vinícius Thiengo (1) (0)
06/06/2018
Wesley, tudo bem?

É possível sim permitir que o usuário defina o horário de funcionamento do AlarmManager, mas terá de enfrentar algumas pequenas barreiras a partir do Android 6, Marshamllow, isso devido ao modo soneca, Doze Mode, adicionado a partir dessa versão do Android.

Logo, não deixe de estudar a fundo o conteúdo do link a seguir da documentação oficial:

-> Otimização para soneca e aplicativo em espera: https://developer.android.com/training/monitoring-device-state/doze-standby?hl=pt-br

Wesley, a parte de permitir que o usuário entre e preenche o horário do despertar do aplicativo, essa parte é um algoritmo que também utilizará o AlarmManager, pois campos como o EditText ou Spinner terão de estar em tela para a entrada de dados, além dos códigos de manipulação dos valores destes componentes visuais para o correto preenchimento do AlarmManager.

Não deixe de acessar as APIs de alarme e de relógio do Android-Arsenal, pode ser que alguma já lhe atenda bem:

-> Alarm: https://android-arsenal.com/search?q=alarm

-> Clock: https://android-arsenal.com/search?q=clock

Abraço.
Responder
wesley (1) (0)
09/08/2018
comecei um teste usando o seu video, porem pelo que percebi quando você usa o log para visualizar quando o alarme dispara, o horario em sempre de 5 em 5 segundos como você programou, mais eu nao consigo, no meu esta atrasando...qual seria o problema, ja tentei resolver varias vezes...obrigado
Responder
Vinícius Thiengo (0) (0)
13/08/2018
Wesley,

O AlarmManager não é mais preciso desde o Android API 19 (KitKat). Ele pode atrasar ou adiantar o disparo.

Na comunidade Android, como solução, vi que se o AlarmManager for utilizado no modo "disparo único", ou seja, não utilizando o modo "disparos repetidos a cada x tempo", segundo a comunidade dessa forma o AlarmManager é preciso.

Para simular o modo "repetido" quando utilizando o modo "disparo único" basta colocar o algoritmo de criação de um novo AlarmManager sempre após a execução do AlarmManager atual em disparo.

No link a seguir tem mais conteúdo sobre uma melhor performance com o AlarmManager:

https://stackoverflow.com/questions/33707581/start-alarmmanager-at-precise-time-even-if-the-app-is-not-running

O conteúdo do link a seguir, direto da documentação oficial do Android, também vai lhe ajudar na construção de um alarme preciso:

https://developer.android.com/training/scheduling/alarms

Abraço.
Responder
Wesley (1) (0)
02/09/2018
Boa tarde Vinicius...

To fazendo meu tcc e ate agr vc me ajudou muito com as respostas acima e estou aki para te pedir novamente uma ajuda.
To usando firebase para salvar as informações e o AlarmManager para os despertadores. Tenho que fazer uma classe especifica exemplo DisparaAlarme onde pega as horas salvas no banco de dados para despertar todos os alarmes salvos ou tem outra forma de realizar isso...
obrigado desde jah pela força
Responder
Vinícius Thiengo (0) (0)
02/09/2018
Wesley, tudo bem?

Show de bola que você está conseguindo prosseguir com o seu TCC.

Na verdade, utilizar uma classe específica para obter o alarme e dispara-lo é uma lógica de negócio possível.

Provavelmente você não encontrará nenhuma API simples que já faça isso para você:

-> Permita o fácil acesso ao banco de dados de seu projeto;

-> Com os dados obtidos dispara o alarme.

Isso, pois o roteiro acima é específico de seu domínio de problema, e confesso que utilizar uma classe tendo somente a responsabilidade de alarme é uma excelente escolha.

Ou seja, seguir com a sua classe DisparaAlarme tende a ser um caminho eficiente em seu aplicativo Android, digo, em termos de obter e disparar o alarme quando necessário.

Abraço.
Responder
wesley (1) (0)
06/09/2018
obrigado pelas dicas,mais algumas duvidas...
meu app tem o dever de acionar 4 tipos de alarmes diferentes...um para cada atividade, no caso eu teria que fazer uma classe disparaAlarme para cada tipo?
e no caso teria que fazer uma função onde pega todos os alarmes cadastrados de um certo tipo e jogar no alarme? ou criar um alarme para cada alarme salvo?

muito obrigado pela força..abraços
Responder
Vinícius Thiengo (0) (0)
07/09/2018
Wesley,

Todas as dúvidas são relacionadas a lógica de negócio de seu sistema. Você pode ter uma classe para cada tipo de alarme ou então ter apenas uma para todos os tipos.

Não tem uma melhor escolha, alias, a melhor escolha é aquela que permite a boa leitura de seu código por parte de qualquer outro desenvolvedor que participa dele ou que pode vir a participar.

Eu confesso que eu buscaria trabalhar com polimorfismo para ter uma classe para cada tipo de alarme, porém sem repetir códigos.

Abraço.
Responder
wesley (1) (0)
07/09/2018
valew brother...
Responder
KAMILA DOS SANTOS SOUZA (1) (0)
23/03/2018
Boa   noite, Vinicius !
com esse código eu conseguiria envia uma mensagem de um web service  para a tela do celular e tocar o alarme na hora ?
Responder
Vinícius Thiengo (1) (0)
24/03/2018
Kamila, tudo bem?

Não somente com este código. Mas a parte de tocar o alarme, como seria independente de algum tempo e sim dependente da chegada de uma massagem push, essa parte pode ser substituída somente por alguma API de alerta, como as presentes no link a seguir:

-> https://android-arsenal.com/search?q=alert

Para a mensagem que será entregue do servidor Web você pode utilizar o principal sistema de notificação push no Android, o Firebase Cloud Messaging (FCM). Veja os conteúdos dos links a seguir para o trabalho com essa API:

-> https://www.thiengo.com.br/fcm-android-dominio-do-problema-implementacao-e-testes-com-servidor-de-aplicativo-parte-1

-> https://www.thiengo.com.br/fcm-android-relatorio-e-notificacao-por-topicos-parte-2

-> https://www.thiengo.com.br/fcm-android-notificacao-personalizada-com-notificationcompat-parte-3

Abraço.
Responder
06/03/2018
Boa tarde Vinícius Thiengo!

Estou fazendo um aplicativo no Android Studio que lembra a hora certa de tomar remédio, mas estou com muita duvida em qual é a função que posso usar para criar o "despertador" seria AlarmManager? Se não! Vc sabe qual classe faz isso? tem algum material para me indicar?

Desde já lhe agradeço!
Responder
Vinícius Thiengo (0) (0)
12/03/2018
Rivaldo, tudo bem?

Você pode sim utilizar a API AlarmManager para construir esse aplicativo. Mas fique ciente sobre as limitações que o aplicativo terá caso ele não esteja listado na white-list do device:

-> Mais sobre as limitações devido ao Doze Mode: https://developer.android.com/training/monitoring-device-state/doze-standby.html?hl=pt-br

-> Como colocar o aplicativo na White-List: https://source.android.com/devices/tech/config/perms-whitelist

A seguir os links de algumas APIs que podem facilitar a ti o trabalho de criar um alarme preciso:

-> Job Schedulers: https://android-arsenal.com/tag/49?sort=rating

-> AlarmManager: https://android-arsenal.com/search?q=AlarmManager

Abraço.
Responder
Manoel Pereira (1) (0)
13/11/2017
Ola amigo. preciso fazer uma agenda onde devo usar calendario, relogio, gravador de voz.   estou usando o android. quero saber se pode me ajudar.
Responder
Vinícius Thiengo (0) (0)
13/11/2017
Manoel, tudo bem?

Sem problemas quanto a ajuda. Vou lhe indicar o que estudar / integrar em seu aplicativo.

Vamos começar pelo domínio do problema, qual é o de seu app (supermercado, rádio, ?)?

Abraço.
Responder
Luciano Alexandre (1) (0)
13/03/2017
Olá Thiengo, blz
Olha, gastaria de sua ajuda. Como fazer a entrega, ou seja, como disparar um AlarmManager no Android na hora exata definida, todos os dias nas apis acima da 19. Ou seja, no android marshmallow, por exemplo. Uma vez q houveram mudanças após essas atualizações do android, onde setRepeat foi substituído por setInexactRepeat na api 23. Já tentei, procurei no pai google, mas até agora nada. Conto com sua ajuda, pq sei q vc é fera e tem muito conhecimento. Desde já, muito obrigado
Responder
Vinícius Thiengo (1) (0)
16/03/2017
Luciano, tudo bem?

Tem um tempo que não trabalho com aplicativos que precisam de alarme, mas sei das novas limitações no Android desde a versão 23.

Pesquisando aqui vi que existem dois métodos que podem lhe ajudar a ter exatidão nos alarmes. A primeira tentativa é com o setAlarmclock(). Caso não funcione com ele, a outro tentativa é com o setExactAndAllowWhileIdle().

Não deixe de acessar a resposta sobre esses caras em: http://stackoverflow.com/a/32511496/2578331

Lá tem uma explicação melhor sobre.

Ambos os métodos citados conseguem passar pelo Doze Mode sem problemas. Mais sobre o Doze Modo no artigo a seguir: http://www.thiengo.com.br/gcmnetworkmanager-para-execucao-de-tarefas-no-background-android#title-1

Abraço.
Responder
Flávio (1) (0)
08/06/2016
Thiengo, conseguir fazer o app disparar alarme, mas quando uso o setRepeting ele é muito inexato (já vi a documentação e fala que todos os alarmes a partir da api 19 são inexatos), o problema é que eu queria que ele realmente repetisse no tempo exato, ou pelo menos numa margem de erro menor que 5min. As vezes ele dispara 30 min depois dependendo do tempo de repetição. Quando a repetição é com pouco tempo funciona certo, mas quando é com horas, tipo 2 ou 4 horas ele sempre dispara no momento errado. Eu queria saber se tem como deixar ele mais preciso ou usar outro método para ele disparar com mais exatidão.
Responder
Vinícius Thiengo (0) (0)
11/06/2016
Fala Flávio, blz?
Por ser inexato e vc querer um alarme, pode descarta-lo. Encontrei o AlarmClock (https://developer.android.com/reference/android/provider/AlarmClock.html?hl=pt-br ), ainda não o conheço, mas veja se sana seu problema.

A princípio a outra solução que tive em mente foi utilizando o FCM, mas agora é saber se mesmo em modo offline, se ele trabalha legal com o time. Abraço
Responder
vinicius (1) (0)
29/10/2015
Thiengo, como faria para pegar por exemplo um horário para disparar o alarme em um Banco SQLite? Preciso criar uma app para cadastrar diversos usuário e cada um poderia criar o alarme e ficar repetindo esse alarmar durante um determinado periodo (12 em 12 horas por exemplo), mas não estou entendendo muito bem como buscaria essas informações no BD. Você pode me dar um help?
Responder
Vinícius Thiengo (0) (0)
30/10/2015
Fala Vinicius, blz?
Na verdade assim que o user criar o alarme pelo formulário que sua APP vai disponibilizar para essa funcionalidade, seu script vai além de criar o alarme no AlarmManager (esse já vai ficar repetindo sem necessidade de uso do SQLite) vai tb salvar esses dados de alarme no SQLite. Esses dados do SQLite somente serão acessados novamente caso o user altere o alarme, então irá deleta-los para salvar novos, ou caso o device seja rebootado, nesse ultimo caso o Android não persiste na memória os dados salvos para o AlarmManager funcionar, então assim que o device for rebootado não há mais nada sobre o AlarmManager que sua APP criou, nesse caso com o auxilio de um BroadcastReceiver (http://www.thiengo.com.br/broadcastreceiver-no-android-executando-tarefas-no-background ) e o BOOT_COMPLETED sua APP vai acessar o SQLite e recriar o AlarmManager para que continue executando como se nada tivesse acontecido. Abraço
Responder
João Arthur (1) (0)
26/03/2015
Thiengo existe alguma forma de iniciar um alarme sem que o usuário entre na aplicação, por exemplo quando o usuário instalar o app ele já começar a rodar o alarme, preciso criar um rotina que fique rodando e fique olhando a hora, por exemplo quando for 08:00 da manhã eu disparar uma service e quando for 18:00 parar essa service
Responder
Vinícius Thiengo (1) (0)
26/03/2015
Sem o usuário entrar no APP a opção que vejo é vc fazer algumas gambiarras, um exemplo seria vc definir tb em seu APP listeners para mensagens e chamadas telefonicas, assim com um BroadcastReceiver vc poderia captar algum desses eventos e inicializar o AlarmManager se ele já não tiver sido inicializado. Lembre que por estar utilizando um AlarmManager vc terá tb de implementar o BroadcastReceiver para ouvir ao BOOT_COMPLETED para caso o usuário reboot o aparelho vc poder recriar o AlarmManager. Abraço
Responder
João Arthur (1) (0)
27/03/2015
Valeu Thiengo, só mais uma dúvida, como eu configuro um alarm para disparar uma service as 08:00 da manhã e as 18:00 ele parar essa service ? tipo quando o usuário entrar pela primeira vez na aplicação e ele configurar esse alarm
Responder
Vinícius Thiengo (1) (0)
27/03/2015
Fala João Arthur, ao invés de colocar código vou lhe falar uma maneira de fazer isso.

Na primeira vez que o usuário entrar na APP vc consegue verificar isso trabalhando com flag no SharedPreferences, logo na primeira vez ela está como false. Assim que verificou que é a primeira vez vc cria um AlarmManager para executar a partir das 8h da manhã (já execute ele se for que 8h e menos de 18). Lembre que ele executa baseado na distancia de tempo, ou seja, vc não colocará para executar as 8h e sim para executar de acordo com o tempo em milliseconds que faltam para ser as 8h da manhã, isso se já não estiver o tempo no intervalo de 8h as 18h. Executando o Service, vc verifica via flag dentro do Service se ele já não estava rodando, se não vc configura um novo AlarmManager para executar na próxima hora 18 (a distancia do tempo atual até as 18h, isso em milliseconds) para finaliza-lo, tendo em mente que ele estará começando a execução naquele momento. Caso entre no service e a flag interna dele (vc colocará essa flag como variável de instancia dentro da classe que extends Service) indique que o Service estava executando vc então cria um novo AlarmManager que executará na próxima hora 8 da manhã, colocando a distancia em tempo em milliseconds como feito anteriormente, e então fecha o Service. Dessa forma ficará executando todos os dias. Não esqueça de setar a flag de retorno correta no método onStartCommand() (em seu caso seria START_FLAG_REDELIVERY) para caso o Android tenha de finalizar seu Service temporariamente. E não esqueça de trabalhar a lógica com o BroadcastReceiver no caso de um BOOT_COMPLETED, para voltar o AlarmManager, como já sabe os horários de execução não há necessidade de um SQLite guardando dados de configuração de execução do AlarmManager. Abraço
Responder
João Arthur (0) (0)
30/03/2015
Thiengo consegui fazer usando sua dica, mas estou com um problema na service, meu alarm dispara a service as 8 da manhã e gero uma notificação assim que ela inicia no onCreate, no entanto com o passar do tempo essa service fica sendo criada novamente como se tivesse passando no create de novo e fico recebendo a notificação que criei no onCreate dessa service ou seja ela ta sendo criada várias vezes, pude observar por duas vezes que isso aconteceu quando eu liguei minha conexão com a internet do dispositivo não sei o que isso tem a ver, mas me parece que quando fiz isso ele iniciou a service novamente gerando a notificação que programei no onCreate. Não é toda vida que isso acontece, quando eu boto em curto intervalo de tempo ele funciona direitinho, você tem alguma ideia pra me ajudar ?

Obs.: essa service registra um broadcast via api com algumas action "SCREEN_ON", "SCREEN_OFF" e uma outra personalizada para parar a service e desregistrar o broadcast no caso essa é executada as 18hs
Responder
Vinícius Thiengo (1) (0)
31/03/2015
Fala João, blz?
Tenha em mente que como seu service está executando a sua APP não está no topo da pilha de Activities devido a ela não estar em execução o Android pode então desligar seu Service quando precisar de mais memória e consequentemente de acordo com o retorno de seu método onStartComand() no Service o Android pode voltar com seu Service assim que sobrar mais memória, logo o Service será recriado. Provavelmente é isso que está acontecendo. É ai que entra ou um SharedPreferences ou um SQLite para saber se já está no horário da notificação, eles trabalhariam como flags, se o Service foi reiniciado, porém o horário ainda não é o correto, não dispara, caso contrário dispara e muda a flag na persistência, assim mesmo que o AlarmManager seja chamado logo depois, vc verifica na persistência a flag de notificação para saber se é ou não para envia-la. Abraço
Responder
João Arthur (1) (0)
31/03/2015
Valeu Thiengo, implementei uma lógica no onStartCommand() pra não acontecer mais a notificação nem o a rotina, com certeza era isso que estava acontecendo o android tava tirando minha service do ar e quanto voltava ele executava o create e mandava a notificação novamente, cara obrigado por sempre está disposto a ajudar a comunidade, abraço.
Responder
09/03/2015
Eae Vinicius, estou com problemas em agendar um evento no google agenda (Google Calendar) do usuário, estou confuso com a API que a Google disponibiliza, se vc conhecer, teria como me dar alguma dica?
Responder
Vinícius Thiengo (0) (0)
10/03/2015
Fala Afonso, blz?
Não utilizei ainda essa API, mas diga ai, é alguma exception ou a utilização é que está confusa (como acontece com o SyncAdapter)? É dessa API que está falando (http://developer.android.com/guide/topics/providers/calendar-provider.html )? Abraço
Responder
Afonso Ambrósio (1) (0)
10/03/2015
Exatamente, a o problema é na utilização, meu inglês ainda é bem básico ai me confundi com coisas como, qual .jar tenho que importar ou se não preciso importar. A API é essa mesma, o aplicativo é uma especie de agenda, e a intenção é ele adicionar um evento do aplicativo à seu Google Agenda (Google Calendar). Abraço!
Responder
Vinícius Thiengo (0) (0)
11/03/2015
Afonso, tente um tutorial assim (http://examples.javacodegeeks.com/android/core/widget/android-calendarview-example/ ). Eu pretendendo falar sobre o CalendarView, mas não por agora... esse tutorial acima pode lhe ajudar a implementar. Abraço
Responder
Afonso Ambrósio (0) (0)
13/03/2015
Então, interação com calendario local e calendarview eu até entendi, o problema é interagir com a conta do google do usuario, agendar um evendo no google calendar (https://calendar.google.com )
Responder
Vinícius Thiengo (0) (0)
14/03/2015
Fala Afonso.
Pesquisei aqui e realmente não há mt conteúdo sobre isso, encontrei essa discussão boa no stackoverflow (http://stackoverflow.com/questions/8918968/sync-event-added-programmatically-with-google-calendar-in-android ), ve se lhe ajuda. Qualquer coisa volte ae. Abraço
Responder
28/02/2015
Vinicius eu não assisti o video, por que cansei de estudar sobre AlarmManager, eu estou com um problema  a muito tempo, eu quero criar um alarme completo, que a pessoa agende os dias de repetição igual aqueles nativos que vem no android, você escolhe os dias da semana, mas eu não estou conseguindo por favo me diga como fazer isso. :D
Responder
Vinícius Thiengo (0) (0)
01/03/2015
Fala Ríchard, blz?
Já tentou utilizar junto ao AlarmManager uma lib de Calendar (https://github.com/roomorama/Caldroid ) e mais dois campos (hora e minuto) Spinner para permitir o usuário definir os dias e horários? Lembre que vc deve salvar todos os alarms tb no BD local (SQLite) para que quando o device seja reiniciado os Alarms sejam recriados, pois na reinicialização eles são desativados, nesse caso vc utilizaria um BroadcastReceiver (com o intent-filter android.intent.action.BOOT_COMPLETED) para ouvir quando o device terminou a reinicialização e então dentro do método onReceive() vc recriaria todos os Alarms do Bd local que ainda não foram disparados. Abraço
Responder
02/03/2015
Valeu pela dica, vou pesquisar, eu já tenho toda interface e ele tem quase tudo, ele também salva na db local, mas eu não dessa que se ele reinicia some. O meu app no momento está assim: uns buttons um para ir para a pagina de agendamento, um para excluir tudo da lista(mas não cancelar os alarmes), na tela de agendamento tem um timepicke onde vc decide a hora, um edittext onde vc coloca o nome para o alarme e checkBoxs para cada dia da semana(pq a interface e básica)
ele consegue disparar o alarme.
Responder
Vinícius Thiengo (0) (0)
03/03/2015
Shoa de bola, a parte que vi que falta mesmo é quando for reiniciar os alarmes devido ao reboot do aparelho (q vc falou que ainda não fez), mas ai é verificar quais devem ser reiniciados e acredito que a lógica que lhe informei em email tb pode ser boa, de toda vez que o Alarm disparar verificar no bd se é para criar um novo dele ou não, ou seja, não trabalharia com o AlarmManager de repetição, isso ficaria a cargo do script com os dados do SQLite. Abraço
Responder
Alex Passos (0) (0)
24/04/2014
Vinícius... como faço para determinar a data e a hora para alarmar?
Responder
Vinícius Thiengo (0) (0)
24/04/2014
Fala Alex, blz? Então acho que vc vai ter que utilizar a lasse Calendar com um tempo definido por vc e depois convertido em milisegundos... está fuçando o stackovrflow para achar um exemplo legal e encontrei um que pode lhe ajudar, vá na resposta correta na página, somente note que o camarada utiliza o método setRepeating() do AlarmManager, se vc quiser rodar apenas uma vez utilize o método set()... segue link: http://stackoverflow.com/questions/3052149/using-alarmmanager-to-start-a-service-at-specific-time

Abraço
Responder
Alex Passos (0) (0)
25/04/2014
Cara... e eu tenho que salvar essa data e hora no SQLite por exemplo ou essa classe já faz isso? Exemplo se eu quiser que me avise no dia 30/04/2014 às 10:00.
Responder
Vinícius Thiengo (0) (0)
25/04/2014
Isso, vc vai definir apenas quando é que o Alarm deve ser disparado, não precisa guardar nada em SQLite não, quando dé o tempo o Alarm dispara sozinho.
Responder
Alex Passos (0) (0)
26/04/2014
Beleza, comprei os 2 livros que você me indicou estou aguardando chegar, morar no interior é foda compra na internet nada é rápido.

Seguinte fiz o exemplo do alarmmanager do video só que o seu funciona e o meu não e aparentemente esta tudo certo.

É naquele projeto de lembretes que tem mandei outro dia.

Como esta o código:

boolean alarmeAtivo = (PendingIntent.getBroadcast(this, 0, new Intent("ALARME_DISPARADO_Lembrete"), PendingIntent.FLAG_NO_CREATE) == null);

if(alarmeAtivo){
Log.i("Script", "Novo alarme");

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 3);

//calendar.set(Calendar.DAY_OF_MONTH, 26);
//calendar.set(Calendar.MONTH, 4);
//    calendar.set(Calendar.YEAR, 2014);
//    
//    calendar.set(Calendar.HOUR_OF_DAY, 9);
//    calendar.set(Calendar.MINUTE, 45);
//    calendar.set(Calendar.SECOND, 0);
//    calendar.set(Calendar.AM_PM,Calendar.AM);

    Intent intent = new Intent("ALARME_DISPARADO_Lembrete");
PendingIntent p = PendingIntent.getService(this, 0, intent, 0);

AlarmManager alarme = (AlarmManager) getSystemService(ALARM_SERVICE);
alarme.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 5000, p);
}
else{
Log.i("Script", "Alarme já ativo");
}
Responder
Vinícius Thiengo (0) (0)
26/04/2014
Alex verifique se seu service está declarado no AndroidManifest e se ele está esperando a ação ALARM_SERVICE. Em seu Service coloque um Log no método onStartCommand() para verificar se realmente ele não está sendo chamado. Outra coisa é que se vc estiver utilizando o emulador o horário tende a estar adiantado, log corrija indo em settings e setando o horário como horário de brasilia. depois fale se passou, abraço
Responder
Alex Passos (0) (0)
26/04/2014
O meu AndroidManifest esta sim:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android "
    package="com.lembrete"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="14" />
    <uses-permission android:name="android.permission.VIBRATE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/notepad48"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.lembrete.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
         <receiver android:name="BroadcastReceiverAux" android:label="BroadcastReceiverAux">
            <intent-filter>
                <action android:name="ALARME_DISPARADO_Lembrete"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>
Responder
Alex Passos (0) (0)
26/04/2014
E eu já tinha certado o horário no emulador
Responder
Vinícius Thiengo (0) (0)
26/04/2014
Alex, vc não declarou seu service em nenhum lugar do AndroidManifest, para o sistema ele nem existe. O que vc declarou na manifest foi um Activity e um BroadcastReceiver. Segue um exemplo de um Service declarado no manifest (no mesmo nível que Actiity e BroadcastReceiver):

<service android:name=".WalkerService" android:label="WalkerService"></service>
Responder