Hoje, estudei um pouco sobre BroadcastReceiver com auxilio do livro "Google Android de R. Lecheta". Para reforcar aproveitei para usar alguns outros conceitos ja estudados nesta pequena aplicacao de teste que sera explicada neste post.A aplicacao desenvolvida e algo muito simples e no mundo real ninguem criaria uma calculadora como esta. Lembre-se, o aplicativo foi criado apenas para estudar alguns conceitos (Principalmente o BroadcastReceiver).Mas de que se trata o BroadcastReceiver?Assim como as Activities podem ser chamadas por outras Activities atraves da utilizacao de Intents, Receivers tambem podem ser "chamados".A principal diferenca entre uma Activity e um Receiver e que o Receiver e executado em background e geralmente nao deve realizar interacao com o usuario (para evitar interrompe-lo).Alem disso, um receiver possui um tempo maximo para executar alguma tarefa determinado em 10 segundos. Caso sua tarefa ultrapasse este tempo o Receiver e interrompido pelo sistema operacional.Para as Activities que disponibilizamos, geralmente utilizamos um IntentFilter que diz o nome da Action e Category que permitem ao android encontrar nossa aplicacao.O exemplo classico de um IntentFilter, e o que ja e declarado quando criamos uma aplicacao de HelloWorld no eclipse: <activity android:name=".LivroAndroidCap7Activity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>Para um Receiver responder a uma Intent, o mesmo tambem precisa ser declarado com um IntentFilter. Um Receiver pode atender a varias Actions nativas como BOOT, recebimento de SMS, eventos relacionados a bateria alem de poder atender a Actions customizadas (strings definidas pelo proprio desenvolvedor).Criando a calculadoraBom, entao vamos logo para a criacao da calculadora. A ideia aqui e criar um aplicativo que possui uma tela inicial que mostra apenas um botao com o rotulo Calcular conforme mostrado na figura abaixo:Ao pressionar este botao, o usuario recebera um formulario com 3 campos dentro de um AlertDialog. O formulario poderia ter sido criado na mesma tela que o botao calcular, mas eu quis complicar um pouco mais so para brincar um pouco mais com outras funcionalidades do android (neste caso usar um AlertDialog).Caso o usuario selecione o botao Calcular neste formulario, os dados para o calculo sao enviados para o sistema operacional atraves de uma Intent definida com o seguinte intent filter: <intent-filter> <action android:name="CALCULO" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>Considerando este IntentFilter, outros aplicativos podem ser criados para enviar um broadcast com dados para CALCULO. Outros Receivers tambem podem ser criados para receber dados para calcular e efetuar estes calculos de forma diferente (por exemplo algum tipo de calculo alienigena).A primeira coisa que criei neste projeto foram os layouts definidos no diretorio res/layout do projeto.main.xml (layout que possui apenas o botao calcular - tela inicial) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/calculadora" /> <Button android:id="@+id/btCalcular" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/calcular" /> </LinearLayout>layout_form.xml (layout que possui os campos do formulario - usado no AlertDialog) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/primeiro_numero" /> <EditText android:id="@+id/numero1" android:inputType="number" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/segundo_numero" /> <EditText android:id="@+id/numero2" android:inputType="number" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/operacao" /> <Spinner android:id="@+id/operacao" android:layout_width="fill_parent" android:layout_height="wrap_content"/> </LinearLayout>Apos definir os layouts, criei as classes