Tutorial Android #20 – Alarmes

Olá pessoal! Aqui estamos nós com mais um tutorial de Android para alegria geral da nação. No episódio tutorial de hoje, vamos ver como criar um alarme para nos avisar a hora do almoço (tudo a ver com o aplicativo de restaurante, não?).

O primeiro passo é criarmos uma forma para o usuário configurar o horário em que ele deseja ser avisado do almoço. Poderíamos definir isto em uma Activity, mas esta opção soa mais como uma configuração. Dessa forma, vamos criar a classe PreferenciaHorario no pacote net.rafaeltoledo.restaurante, estendendo a classe DialogPreference. Logo em seguida explicarei os conceitos principais dela.

Bastante coisa, não? Vamos por partes.

Os métodos obterHora() e obterMinuto() servem para extrair a parte inteira do horário que será armazenado como uma string “00:00“. Temos três versões do construtor da classe, que no final sempre referenciam o terceiro. Isso é devido à superclasse. Ainda no construtor, definimos os nomes dos botões na janela de configuração de horário. onCreateDialogView() devolve um objeto View com a tela criada. Poderíamos aqui definirmos um layout, mas simplesmente devolvemos um widget TimePicker. O método onBindDialogView() é chamado após o onCreateDialogView() é encarregado de preencher a caixa de diálogo. onDialogClose(), como o próprio nome diz, é chamado quando a janelinha é encerrada. Caso o usuário pressione o botão de confirmar (condição positiveResult), o valor é armazenado em SharedPreferences. O método onGetDefaultValue() é utilizado para a conversão interna do Android para o tipo do objeto. Por último, o método onSetInitialValue(), como o próprio nome diz, atribui um valor padrão. Ele verifica se há algum valor já salvo, ou padrão ou então atribui 00:00.

O próximo passo é adicionar a opção para a configuração do alarme pelo usuário. Dessa forma, edite o arquivo preferencias.xml da seguinte forma:

A primeira opção adicionada, do tipo CheckBoxPreference não tem muito segredo… a segunda, foi a que definimos na classe PreferenciaH0rario. Configuramos seu valor padrão para 12:00 e definimos que ela depende da opção alarme, ou seja, ela só estará habilitada caso alarme também esteja habilitada.

Neste projeto vamos utilizar o AlarmManager para gerenciar o nosso alarme. Porém, ele tem uma falha: toda vez que o celular é desligado, ao ligar novamente os alarmes não são configurados. Para resolver isso, vamos criar a classe ReceptorBoot para realizar essa configuração toda vez que o sistema for ligado. Crie-a no pacote net.rafaeltoledo.restaurante.

A tarefa do ReceptorBoot será realizado no método onReceive(). Por enquanto, coloque-o pra descansar. Já já voltamos nele.

Prosseguindo, precisamos adicionar o nó <receiver> no arquivo AndroidManifest.xml para que ele possa atuar no boot. Adicione-o ao final do nó application.

Além disso, adicione também a permissão para obter o sinal de boot completo do sistema.

Precisamos agora tratar as preferências do usuário para configurar o alarme. Quando o usuário ativar o checkbox do alarme, precisamos ativar o alarme no tempo selecionado. Quando o usuário modificar o alarme (por exemplo, para 11:00), devemos criar um novo alarme com o AlarmManager. Se ele desativar, precisamos cancelar o alarme existente. E, por fim, em um processo de boot, se o alarme estiver selecionado, precisamos criá-lo.

Para fazer todo esse trabalho, adicione os seguintes métodos na classe ReceptorBoot. Para corrigir os imports, só lembrar do Ctrl + Shift + O.

Também atualize o método onReceive():

Bem, no código listado acima, primeiramente, ao receber o sinal do boot (método onReceive()), configuramos o alarme, através do método configurarAlarme(). Neste método, obtemos o AlarmManager, e obtemos as preferências do usuário para o alarme (se existirem), e a montamos em um objeto do tipo Calendar. Caso alarme seja anterior ao horário atual, adicionamos um dia a ele e configuramos para repeti-lo diariamente. Já no método cancelarAlarme(), cancelamos o alarme vinculado ao contexto, obtendo o AlarmManager e obtendo um objeto PendingIntent (como se fosse uma tarefa pendente) com o método obterIntentPendente().

No código que temos até agora, o alarme só é armado na inicialização do sistema. Para que ele funcione da maneira como desejamos, precisamos adicionar alguns método a classe EdicaoPreferencias:

Lembre-se também de adicionar o membro privado da classe chamado preferencias:

O que nos falta fazer é criar um receptor que exiba o alarme na tela quando o alarme disparar. Para isso, primeiramente crie o arquivo alarme.xml na pasta res/layout:

Bastante simples, ele simplesmente exibirá bem grande na tela Hora do almoço!. Agora vamos criar a Activity que exibirá o aviso propriamente dito. Crie a classe AlarmeActivity no pacote net.rafaeltoledo.restaurante:

Crie também uma classe chamada ReceptorAlarme que será encarregada de iniciar a AlarmeActivity.

Encerrando (ufa!), falta somente adicionarmos esse último receptor no AndroidManifest.xml. Adicione-o no fim do nó application.

E é isso!

Como sempre, pra baixar o projeto, só clicar aqui.

Até logo!

11 comentários sobre “Tutorial Android #20 – Alarmes

  1. Sirley disse:

    Olá amigo, a explicação está muito boa, mas o código não roda devido um erro que está apresentando (Project ‘ListaDeRestaurantes’ is missing required library: ‘C:\Users\Software1\Downloads\twitter4j-android-2.2.5\lib\twitter4j-core-android-2.2.5.jar’) já tentei roda em várias api`s, por que está ocorrendo esse erro é normal ou falta uma biblioteca, obrigado!

    Curtir

  2. Caio disse:

    Muito bom esse exemplo. Mas é possível fazer mais de uma configuração de alarme. Por exemplo igual a do alarme do android, onde o usuário cadastra um horário e depois pode ir adicionando quantos ele quiser ?

    Curtir

  3. André Luís Kunde disse:

    Muito legal esse tutorial!!
    Estava tentando aplicar em minha aplicação, mas eu preciso que ele toque uma vez por mês, e não todos os dias.
    Já tentei fazer algumas modificações, mas não tive sucesso….
    Você saberia me ajudar?

    Curtir

  4. Robson Barreto disse:

    Olá Rafael, eu implementei esse alarme em um projeto meu, mas infelizmente ele não dispara, eu configuro o horário mas quando o relógio atinge esse determinado horário não ocorre nada. Você poderia me apontar um possível erro?

    Curtir

  5. Felipe Lopes disse:

    Boa noite, Rafael. Implementei este alarme mas, por algum motivo, quando entro na tela de preferencias, o espaço onde estaria o item da lista para configurar o horário do alarme, está em branco. Porém, se eu clico nele, a DialogPreference é aberta. Ou seja, quando entro na tela, as informações definidas no android:title e android:summary não estão aparecendo. Poderia me dar um norte para resolver isto?

    Curtir

  6. Jorge M. Abdalla disse:

    Para criar mais de um alarme, teria q criar um xml, uma Activity, e todas as configurações para cada ou tem como deixar uns 7 :v alarmes em uma configuração só!

    Curtir

  7. Kedson Silva disse:

    Boa noite Rafael, eu gostaria de saber se há possibilidades de criar uma codificação que exiba apenas uma mensagem, junto a um Som , como um despertador. Estou fazendo meu tcc, e necessito criar um alarme de msg e som. Pode me ajudar? Por favor

    Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.