Pular para o conteúdo principal

Respondendo a eventos no Android - BroadcastReceiver

Ola pessoal!

Um telefone qualquer, durante o seu funcionamento realiza diversos "eventos", como por exemplo iniciar uma ligação, finalizar uma ligação, receber um SMS, enfim, o tempo todo o SO do telefone está realizando alguma operação. E na plataforma Android, esses eventos são avisados a todas aplicações e que se desejarem, podem responder a essas ações, e isso é feito através dos BroadcastReceiver.
Para isso, basta você criar uma classe que estenda de BroadcastReceiver e registrá-la corretamente no AndroidManifest.xml. Com isso, o SO irá notificar sua classe que deverá executar em no máximo 2 segundos, e normalmente ela terá três opções:
  • Realizar uma notificação.
  • Iniciar um serviço.
  • Iniciar uma aplicação.
Então, para esse post vamos fazer um exemplo onde ao iniciar o telefone iremos então iniciar a nossa aplicação, tipo de comportamento que já vi muitas pessoas perguntarem como se fazia em Java ME, mas que não era possível.

Criando um BroadcastReceiver

Ao estender uma classe BroadcastReceiver, o método que vamos que ter que implementar é o onReceive, que será chamado pelo SO quando a ação que você deseja interceptar for executada. O código para uma classe que inicie uma Activity é o seguinte:

public class AfterBootBroadcastReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, AfterBootActivity.class);
i.addCategory(Intent.CATEGORY_DEFAULT);
context.startActivity(i);
}
}

O que vemos nesse código é a criação de uma Intent, que será responsável pela criação da atividade, e isso está indicado onde colocamos o AfterBootActivity.class como parametro da criação da Intent. E logo em seguida, inicia-se a atividade através da chamada do startActivity(i).

Registrando no AndroidManifest.xml

Além de criar a classe, é preciso registrar no arquivo de configuração da aplicação para que o Android possa saber que a sua aplicação espera por um determinado evento. Vamos ver então como fica a configuração:

<receiver android:name="AfterBootBroadcastReceiver"
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
    <intent-filter>
       <action android:name="android.intent.action.BOOT_COMPLETED" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>

O principal a se atentar é a propriedade android:permission que deverá ter a permissão correta, pois o usuário precisa ser "avisado" dos tipos de ações a serem executadas em seu telefone. E além disso, dentro das opções de , na propriedade action deverá constar a ação que a sua classe interceptará. E então, simples assim, sempre que o celular finalizar o boot, sua aplicação será iniciada.

Concorrência

Se por um acaso, para alguma ação mais de um BroadcastReceiver quiser abrir uma aplicação, o usuário terá que escolher qual aplicação ele deseja abrir, e ele terá a opção de deixar alguma das aplicações como padrão para no futuro, não ter que escolher novamente.

Para saber mais...

Caso tenha ficado alguma dúvida ainda, um ótimo local para dar uma olhada em mais exemplos e entender melhor é o guia da classe BroadcastReceiver no guia de referência do Android. E não esqueça que você pode participar do grupo de desenvolvedores brasileiros de Android, basta visitar a página do grupo Android Brasil-dev no Google Groups.

Abraços e até a próxima.
Neto Marin

Comentários

Olá Neto.

Eu tive que colocar uma flag no meu Intent para funcionar:

i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Você sabe porque foi necessário?

Obrigado
Neto Marin disse…
Opa.
Provavelmente porque sua Activity não estava configurada como Laucher no AndroidManifest.xml.

[]s
Neto
Então, pior que está configurada sim...ainda não consegui entender porque está pedindo.

Na minha activity tem o seguinte intent-filter:
intent-filter

action android:name="android.intent.action.MAIN"

category android:name="android.intent.category.LAUNCHER"

intent-filter
Felipe Fiorini disse…
Olá, estou pegando o texto de um sms e enviando para uma Activity mas quando chega no método startActivity o programa para de funcionar.

Segue o código

public void onReceive(Context context, Intent intent) {
//pegar o SMS recebido
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
if (bundle != null) {
//pegando conteudo da mensagem
String conteudoSms = "";
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i=0; i<msgs.length; i++) {
msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
conteudoSms += msgs[i].getMessageBody().toString();
}
//Enviando senha para MainActivity
Intent i = new Intent(context, MainActivity.class);
i.putExtra("string", conteudoSms);
context.startActivity(i);
}

}
Silvio Lacerda. disse…
O brodcastReceiver funciona quando mando de volta um sms com um texto fixo. Blz. Mas, quero enviar o número do celular e o conteudo do sms para um serviço para poder rodar um método para pegar as coordenadas GPS. Tenho um código que rodou no emulador mas, no celular dá pau. Estando tudo no brodcastreceiver. creio que o tempo curto de 10 segundo não tem como quero rodar no serviço então. Mas, como chamar um serviço enviando o celular e o sms. Fico muito agradecido. Estou semm dormir direito a dias

Postagens mais visitadas deste blog

Compilador GWT, não se preocupe com JavaScript!

Nesse post vou escrever um pouco sobre o Compilador do Google Web Toolkit , qual é o seu papel no kit, além de algumas dicas para o dia-a-dia no desenvolvimento com a tecnologia. Como exemplo vou usar um novo Projeto Web no Eclipse criado a partir do Google Plugin   para desenvolvimento GWT e/ou App Engine, acesse aqui mais informações e download. Depois de instalar o plugin, dentro do Eclipse siga a sequência para criar o projeto: New - Others - Google - Web Application Project - Defina o nome do projeto e a estrutura raiz de pacotes - Finish. Vou adotar como nome do projeto appGWT e pacote br.com.globalcode . O plugin gera uma aplicativo pronto que permite ao usuário preencher um campo e realizar o envio ao servidor de forma assíncrona (Ajax), quando o servidor responde um Dialog é apresentado com a mensagem de retorno. Para testar a aplicação é só executar o projeto com a opção Wep Application . Veja: O GWT, como já foi comentado , adota um conceito bem interess

O que é Lógica de programação?

Este é o segundo de uma série de posts voltados aos leitores do blog que estão dando início à carreira de desenvolvimento de software. O assunto de hoje é a lógica de programação. Para ler antes: Entendendo como funciona a programação de computadores: linguagens de programação, lógica, banco de dados A lógica de programação é um pré-requisito para quem quer se tornar um desenvolvedor de software, independente da linguagem de programação que se pretende utilizar. Mas o que é de fato a Lógica de Programação e como saber se eu tenho esse pré-requisito? A lógica de programação nada mais é do que a organização coerente das instruções do programa para que seu objetivo seja alcançado. Para criar essa organização, instruções simples do programa, como mudar o valor de uma variável ou desenhar uma imagem na tela do computador, são interconectadas a estruturas lógicas que guiam o fluxo da execução do programa. Isso é muito próximo ao que usamos em nosso cotidiano para realizar atividad

Dica rápida: Apagando registros duplicados no MySQL

Ola pessoal, Sei que vocês estão acostumados a ver posts meus sobre tecnologia móvel ou algo relacionado, mas hoje vou falar sobre um pequeno "truque" que usei esse final de semana com o MySQL. Eu estava desenvolvendo o lado servidor de uma nova aplicação mobile (ahh, então "tem a ver" com mobile hehe), e quando fui fazer alguns testes percebi que tinha quase 7 mil registros duplicados (!!!) na minha base de dados! Bom, o meu primeiro reflexo como programador foi pensar em fazer um "programinha" Java para buscar e deletar todos esses registros duplicados. Mas ai, resolvi tirar as teias de aranha dos neurônios e usar os vários anos de experiência que passei com SQL e criar uma query que fizesse esse trabalho todo de uma vez!! E a query ficou assim: delete from TABLE_NAME USING  TABLE_NAME, TABLE_NAME  AS  auxtable WHERE   ( NOT  TABLE_NAME.id  =  auxtable.id ) AND   ( TABLE_NAME.name  =  auxtable.name ) Explicação direta: TABLE_NAME

Devo fazer um curso ou ler um livro?

Acredito que todos os instrutores ou professores, independentemente da área, escola ou centro de treinamento, já devam ter recebido essa pergunta alguma vez na vida: devo fazer um curso ou ler um livro? Para responder a essa pergunta, precisamos avaliar os prós e contras de cada opção. Trabalho com treinamento há algum tempo e, hoje, recebi essa pergunta de um aluno. Não adianta responder a ou b sem argumentar, demonstrando as opções conforme a situação do aluno. O conteúdo, a forma de transmissão e a capacidade de assimilação do indivíduo são chaves para haver benefício maior de aprendizado. Tanto em um bom curso quanto em um bom livro, o conteúdo é a premissa básica . Por conteúdo entendemos: se está organizado; se respeita pré-requisitos; se promove o aprendizado guiado e incremental; se aborda de forma satisfatória os principais pontos; se tem bom balanço entre teoria, exemplos e prática (favorecendo exemplos e prática); se tem como premissa a acessibilidade possível (e cabível) pa

Saiba como programar para Arduino sem ter nenhum hardware disponível

O Arduino já é uma tecnologia muito difundida entre os amantes de tecnologia. É difícil encontrar um profissional da computação que não brincou um pouco com esta ferramenta de prototipagem ou, que gostaria de fazer isso. Porém, em alguns casos, o programador quer conhecer o arduino mas não dispõe de nenhum hardware, nem mesmo da placa. Como isso poderia ser resolvido? A primeira resposta seria aquela mais simples e direta: ir as compras. Isso pode ser feito em uma loja física ou pela internet. No meu caso, por exemplo, tive a felicidade de encontrar em um site (não me lembro qual) um kit arduino, com um conjunto de sensores e um DVD com 41 vídeo aulas. Mas digamos que o profissional não esteja passando por um bom momento financeiro, ou ainda, simplesmente não queira comprar o Arduino sem antes conhecê-lo um pouco melhor. Para a última situação também já existe uma resposta, e diga-se de passagem, uma excelente resposta. Trata-se do site 123D Circuits.io . Depois de criar seu u

JavaMail: Enviando mensagem HTML com anexos

Introdução Depois do post "JavaMail: Enviando e-mail com Java" , que apresentava como enviar um e-mail com Java, resolvi complementar a assunto apresentando como enviar uma mensagem formatada, em HTML , e também como realizar o envio de anexos. Bibliotecas Além da biblioteca JavaMail, veja mais no post anterior , é necessário incluir o JavaBeans Activation Framework (JAF), apenas se a versão utilizada for anterior ao JSE 6.0 , que já tem o JAF incluso. O JAF está disponível em http://www.oracle.com/technetwork/java/javase/downloads/index-135046.html , e neste download encontramos, alguns exemplos na pasta demo , documentação, incluindo javadocs, na pasta docs e a biblioteca activation.jar , que deve ser acrescentada no classpath da aplicação para versões anteriores ao JSE 6.0. Exemplo Primeiramente devemos realizar a configuração da javax.mail.Session e da javax.mail.internet.MimeMessage , estes passos podem ser vistos no post anterior . Agora vamos montar um