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

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

Entendendo como funciona a programação de computadores: linguagens de programação, lógica, banco de dados

Nesse post, diferente dos últimos que foram mais enfáticos nas experiências com tecnologias, vou focar um pouco mais nos profissionais que estão começando, ou pretendem ingressar na área de desenvolvimento de software, falando sobre conceitos fundamentais relacionados a programação em geral . Mercado de trabalho para programação Conforme já sabemos, o mercado de desenvolvimento de software, especialmente no Brasil, continua em franca expansão, sendo que cada vez mais as empresas buscam desenvolver seus próprios sistemas usando as mais diferentes e novas tecnologias. Algumas matérias interessantes: As seis profissões mais valorizadas em 2010 no IDG Now! Muitas vagas e sensação de reaquecimento da economia Por isso, a área de desenvolvimento de software tem despertado interesse em muitos profissionais de outras áreas que desejam mudar de profissão, já que as oportunidades de trabalho tendem a ser maiores. Esse é um perfil presente em muitos dos clientes da Globalcode que acabou m...

Melhorando Performance de JPA com Spring Web Flow

No TDC2009 realizado pela Globalcode em São Paulo foi apresentado um Lightning Talk sobre um problema específico de performance em aplicações Web com JPA e uma possível solução usando o Spring Web Flow . Num período de 15 minutos, os slides a seguir foram apresentados e seguidos de alguns vídeos de demonstração de uma aplicação Web em execução. Melhorando performance do JPA com Spring Web Flow View more presentations from Dr. Spock . Nesta apresentação foi dito que temos encontrado problemas de performance em aplicações Web que utilizam as tecnologias JSF + JPA + Ajax quando precisamos gerenciar um contexto de persistência (EntityManager). Estes problemas se manifestam quando aplicamos uma resposta errada para a pergunta: Como gerenciar o contexto de persistência numa aplicação Web? Se as aplicações não usam Ajax e limitam-se ao modelo orientado a requisições, a solução mais comum é o uso do design pattern chamado "Open Session In View Filter". Através deste design...

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

Fazer networking em eventos pode transformar a sua carreira! Saiba como

O networking em eventos é vital ao desenvolvimento da sua carreira para construir relacionamentos de longo prazo, bem como uma boa reputação no mercado . Construir uma forte rede de contatos pode te ajudar a se tornar um nome conhecido no mercado, que influencia e causa impacto na sua área de interesse. Além disso, o networking colabora para: aprendizado contínuo; relacionamentos profissionais duradouros; troca de conhecimento com pessoas renomadas no mercado. O bom networking em eventos tem base de confiança e apoio — e pode significar a diferença entre uma carreira comum e fenomenal. Uma maneira de potencializar o networking, é pelo aprendizado continuado , que permite se especializar na área de atuação e expandir o leque de oportunidades. Neste artigo, reunimos algumas dicas para você saber como tirar o melhor proveito de eventos e fortalecer sua carreira. Aproveite a leitura! O que é networking? Networking é sobre construir relacionamentos profissionais de longo prazo, que sejam...

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