AlarmManager no Android, Sua APP Executando Em Tempos Definidos

Receba em primeira mão, e com prioridade, os conteúdos Android exclusivos do Blog. Você receberá um email de confirmação. Somente depois de confirma-lo é que poderei lhe enviar os conteúdos exclusivos.

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
(10919) (56) (1)
Go-ahead
"Sempre procure algo que possa ser aprimorado. Nunca, jamais, conforme-se com o lugar onde está. A maneira como você atinge seus objetivos é sempre experimentar, até que consiga perceber se atingiu um ponto mais alto."
Jeff Sutherland
Kotlin Android
Capa do livro Desenvolvedor Kotlin Android - Bibliotecas para o dia a dia
TítuloDesenvolvedor Kotlin Android - Bibliotecas para o dia a dia
CategoriasAndroid, Kotlin
AutorVinícius Thiengo
Edição
Capítulos19
Páginas1035
Acessar Livro
Treinamento Oficial
Android: Prototipagem Profissional de Aplicativos
CursoAndroid: Prototipagem Profissional de Aplicativos
CategoriaAndroid
InstrutorVinícius Thiengo
NívelTodos os níveis
Vídeo aulas186
PlataformaUdemy
Acessar Curso
Receitas Android
Capa do livro Receitas Para Desenvolvedores Android
TítuloReceitas Para Desenvolvedores Android
CategoriaDesenvolvimento Android
AutorVinícius Thiengo
Edição
Ano2017
Capítulos20
Páginas936
Acessar Livro
Código Limpo
Capa do livro Refatorando Para Programas Limpos
TítuloRefatorando Para Programas Limpos
CategoriaEngenharia de Software
AutorVinícius Thiengo
Edição
Ano2017
Capítulos46
Páginas599
Acessar Livro
Quer aprender a programar para Android? Acesse abaixo o curso gratuito no Blog.
Conteúdo Exclusivo
Receba em primeira mão, e com prioridade, os conteúdos Android exclusivos do Blog.
Email inválido

Opa! Blz?

Nesse vídeo mostro como gerar alarmes no Android com a classe AlarmManager (e cia.). Note que não estou falando de alarmes de relógios (já oferecidos pelos dispositivos mobiles), mas alarmes que vão permitir que nossa aplicação realize alguma tarefa no background (sem o conhecimento do usuário e sem a necessidade de nossa APP estar aberta). Essa é uma maneira de permitir que nós possamos por meio de atulizações no servidor Web e com o auxílio de Notifications, notificar os usuários de nossas APPs quando algo novo ou importante esta no ar em nossas APPs.

Note que nesse vídeo utilizei também as classes BroadcastReceiver e Notification para dar mais evidencia de como a classe AlarmManager é utilizada. Fique atento quanto ao método cancel() de AlarmManager, pois, como falo no vídeo, liberar recursos é extremamente importante em dispositivos mobile devido a limitação grande que esses ainda têm. Mas enfim, vou evitar mais delongas e deixar você assistir ao vídeo.

Se você não conhece ainda os conteúdos Intent, BroadcastReceiver, LogCat e Notification segue os links dos posts que fiz falando sobre esses:

Entendendo e Utilizando o a Classe Log Com o LogCat no Android

Classe Intent e o Conceito de Pilha em Android

BroadcastReceiver no Android, Executando Tarefas no Background

Notification no Android, Criando Notificações Com Toque e Vibração

O link para downlaod do projeto está logo abaixo no post.

Segue link da página da classe AlarmeManager no site oficial do Android

Vlw

Receba em primeira mão, e com prioridade, os conteúdos Android exclusivos do Blog.
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 (7)

Comentários Blog (49)

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...
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