sábado, 22 de junio de 2013

BroadcastReceiver en Android

He estado trabajando en una aplicación para tener los móviles siempre localizados y poder obtener su localización en caso de pérdida o robo. Para conseguir el objetivo, uno de los medios que he utilizado ha sido el BroadcastReceiver que proporciona la plataforma Android.
Los BroadcastReceiver nos permiten ejecutar el código que consideremos oportuno cuando se produce determinada acción en el sistema (en el móvil en cuestión). Se pueden utilizar para monitorizar una gran cantidad de acciones, aunque yo en este ejemplo sólo lo utilizo para monitorizar la recepción de un mensaje personalizado (un Intent definido por mí).
A continuación os dejo unas muestras de código que permiten ver el uso de este componente de Android.
En primer lugar tenemos el código correspondiente al BroadcastReceiver, que estará incluido en una clase que hereda de BroadcastReceiver.

public class Receptor extends BroadcastReceiver {

    @Override
    public void onReceive(Context ctx, Intent intent) {
        Bundle datos = intent.getExtras();
        String mensaje = datos.getString("mensaje");
       
        Activity activity = MainActivity.getActivity();
        Toast.makeText(ctx, "Mensaje recibido: " + mensaje, Toast.LENGTH_LONG).show();
        TextView tvTexto = (TextView)activity.findViewById(R.id.tvTexto);
        tvTexto.setText(tvTexto.getText() + "\n" + mensaje);
    }

}

A continuación, podemos ver el código necesario para enviar un mensaje que active el receptor anterior.

btnSend.setOnClickListener(new View.OnClickListener() {
    @Override
     public void onClick(View v) {
         Intent intent =
                 new Intent("not.ebacelo.testbroadcastreceiver01.retransmision");
         Bundle datos = new Bundle();
         datos.putString("mensaje",
                   "Este mensaje debe recibirlo el BroadcastReceiver");
         intent.putExtras(datos);
         sendBroadcast(intent);
 });

Finalmente, necesitamos registrar nuestra clase para detectar los eventos en el AndroidManifest.

<receiver android:name=".Receptor">
    <intent-filter>
        <action android:name="not.ebacelo.testbroadcastreceiver01.retransmision" />
    </intent-filter>
</receiver>

Como se puede ver, este es un componente fácil de utilizar y que, al mismo tiempo, ofrece un potencial enorme en nuestras aplicaciones.