Ejemplo de Broadcast Receiver en Android

Un Broadcast Receiver es el componente que está destinado a recibir y responder ante eventos globales generados por el sistema, como un aviso de batería baja, un SMS recibido, un SMS enviado, una llamada, un aviso de de la tajea SD, etc. y también a eventos producidos por otras aplicaciones.

Para crear un Broadcast Receiver simplemente tenemos que crear una clase que herede de BroadcastReceiver y sobrescribir el método onReceive() que es el método que se ejecutará cada vez que se produzca el evento al que este suscrito nuestro broadcast receiver. Es importante tener en cuenta que dentro del método onReceive() no se deben de llevar a cabo operaciones que se lleven mucho tiempo ni operaciiones de persistencia.

Ademas de crear el Broadcast Receiver es necesario registrarlo en la aplicación como tal para lo que tenemos dos posibilidades:

  • Añadir en el AndroidManifest.xml un <receiver> con el nombre del Broadcast Receiver y un <intent-filter> con la acción a la que tiene que responer.
  • Si se quiere hacer en tiempo de ejecución se puede realizar mediante el método registerReceiver de la clase Context.

Una vez visto un poco por encima como hacer un Broadcast Receiver vamos a ver un ejemplo sencillo de aplicación que intercepte los SMS recibidos y muestre el mensaje y el número de telefono desde el que se envio el mensaje.

La forma de crear el broadcast receiver es independiente del evento al que se quiera responder ya que simplemente hay que crear una clase que herede de BroadcastReceiver y sobrescribir el método onReceive() con el código que queramos que se ejecute cuando se produzca el evento en cuestión, en nuestro caso cuando recibamos un SMS.

En el caso de este ejemplo lo que hacemos es obtener el SMS recibido para poder mostrar el remitente y el texto del mensaje y simplemente lo mostramos por consola.


package com.poi.broadcastreceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;

public class ReceptorSMS extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("ReceptorSMS", "SMS recibido");
        
        Bundle b = intent.getExtras();
        
        if (b != null) {
            Object[] pdus = (Object[]) b.get("pdus");
            
            SmsMessage[] mensajes = new SmsMessage[pdus.length];
            
            for (int i = 0; i < mensajes.length; i++) {
                mensajes[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
            
                String idMensaje = mensajes[i].getOriginatingAddress();
                String textoMensaje = mensajes[i].getMessageBody();
                
                Log.i("ReceptorSMS", "Remitente: " + idMensaje);
                Log.i("ReceptorSMS", "Mensaje: " + textoMensaje);
            }   
        }   
    }
}

Una vez creado el Broadcast Receiver hay que registrarlo para lo que necesitamos añadir en el AndroidManifest.xml un receiver indicando el nombre del broadcast receiver que hemos creado y la acción que se quiere interceptar. También es necesario añadir el permiso para poder recibir SMS.


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.poi.broadcastreceiver"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />
    
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.poi.broadcastreceiver.BroadcastReceiver"
            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="ReceptorSMS">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>

Y ya esta lista la aplicación. Para hacer las pruebas podemos simular el envio de SMS desde eclipse desde la perspectiva DDMS en la pestaña Emulator control seleccionando SMS y poniendo un numero y el texto del mensaje como en la siguiente imagen.

Captura DDMS

Y como podemos ver en la siguiente captura que nuestra app obtenga la información del SMS no interfiere para nada en el funcionamiento normal del sistema por lo que el SMS se sigue recibiendo de la forma habitual.

Captura DDMS

Si quieres ver otro ejemplo de Broadcast Receiver puedes ver el post Iniciar un servicio en android automaticamente donde puedes ver como hacer que una aplicación se inicie automaticamente cuando se enciende el telefono y siquieres descargarte el proyecto de este ejemplo para probarlo puedes hacerlo desde este enlace.

3 Comments

  1. Gago 5 enero, 2017 Reply
  2. albert martinez 4 mayo, 2017 Reply

Leave a Reply