Programación Android, BroadcastReceiver

Share if you like...Share on Facebook0Tweet about this on TwitterShare on Google+0Share on LinkedIn0

Después de explicar la pasada semana cómo utilizar un Service en android, el siguiente paso lógico es explicar el uso del BroadcastReceiver. Un BroadcastReceiver es un componente android que permite el registro de eventos del sistema.
Todos los Receivers registrados para un evento serán notificados por android una vez que éstos ocurran.

BroadcastReceiver
BroadcastReceiver

Esto quiere decir que nuestro BroadcastReceiver se configurará para responder a una determinada acción del sistema, y el propio sistema será el encargado de notificar al BroadcastReceiver de que ha sucedido dicha acción. De esta manera, podríamos crear, por ejemplo, un BroadcastReceiver que fuera notificado cuando el sistema haya completado el proceso de arranque, registrándolo al ACTION_BOOT_COMPLETED.

Cómo implementar un BroadcastReceiver

Para incorporarlo en nuestra aplicación lo primero que debemos hacer es crear una clase que herede de la clase BroadcastReceiver, y posteriormente registrar el receptor en el manifest.xml de nuestro proyecto. En esta ocasión vamos a crear un ejemplo en el que se mostrará un Toast (mensaje popup) en nuestro dispositivo cada vez que se conecte al cargador.

Crear el BroadCastReceiver

Para eso vamos a crear primero nuestro Broadcast y, para no olvidarnos, lo registraremos automáticamente en el manifest.xml (es recomendable que cada vez que tengamos que registrar algún componente en el manifest.xml de nuestro proyecto lo hagamos inmediatamente, y de esta forma evitamos el descuido que, en el caso de que no sepamos leer el LogCat, puede llevarnos a estar días sin saber resolver un problema causado por no registrar permisos o diversos componentes de la aplicación).

public class OnChargeReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context ctx, Intent i) {
		// TODO Auto-generated method stub

	}

}

 

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.proyectosimio.examplebroadcastreceiver.MainActivity"
            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=".OnChargeReceiver">
            <intent-filter>
                <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
            </intent-filter>
        </receiver>
    </application>

Como vemos, nuestra clase contiene un método onReceive, que será lanzado automáticamente por la llamada del sistema cuando suceda la acción que registramos en el manifest. Este será el punto en que configuraremos y mostraremos nuestro mensaje:

@Override
public void onReceive(Context ctx, Intent i) {
	Toast.makeText(ctx, "Ha conectado el cargador.", Toast.LENGTH_SHORT).show();

}

Y con estos sencillos pasos, automáticamente nos saldría el mensaje de aviso de carga cuando se conectara el cargador.

Crear y usar un Action personalizado para el BroadcastReceiver

Además de tener los Action que ya tiene definidos el sistema, también podemos utilizar un Action que creemos nosotros mismos, y haríamos la llamada a través del método sendBroadcast(Intent i), para que el sistema recogiera la llamada al Broadcast y avisara a todos los Receivers que tuviera configurados con el Action indicado. Por ejemplo vamos a crear un botón en la pantalla de la Activity principal de la aplicación, que al pulsarlo haga la llamada a nuestro BroadcastReceiver con un action personalizado. En primer lugar crearemos un nuevo BroadcastReceiver, y lo registraremos en el manifest.xml, y posteriormente creamos el botón y en su método onClick() haremos la llamada al Broadcast:

public class ButtonReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		Toast.makeText(context, "Se ha pulsado el botón.", Toast.LENGTH_SHORT)
				.show();

	}

}

 

<receiver
    android:name=".ButtonReceiver"
    android:exported="false" >
    <intent-filter>
        <action android:name="com.proyectosimio.BUTTON_RECEIVER" />
    </intent-filter>
</receiver>

 

public void onClick(View v) {
	Intent i = new Intent();
	i.setAction("com.proyectosimio.BUTTON_RECEIVER");

	sendBroadcast(i);
}

En esta ocasión vemos que en el manifest.xml además hemos incluido el atributo exported=”false”, esto es porque al ser un Action que hemos configurado nosotros mismos, debemos indicar, a través de esta propiedad, si permitimos que responda a llamadas que se realicen desde otras aplicaciones, o sólo desde las realizadas por la propia aplicación. En este caso, al asignar el valor false estamos indicando que sólo responderá a nuestra aplicación.

Y con esto ya sabremos crear nuestros propios BroadcastReceiver, que respondan a un Action del sistema, o a uno que hayamos definido nosotros mismos, permitiendo, o no, que nuestros Broadcast con un Action personalizado pueda responder a llamadas de otras aplicaciones.

Descargas

Puedes descargar el proyecto completo aquí.

Share if you like...Share on Facebook0Tweet about this on TwitterShare on Google+0Share on LinkedIn0
The following two tabs change content below.
Reborn as IT Developer. Desarrollador Android y fundador de Proyecto Simio. "En realidad, yo no puedo enseñar nada a nadie, sólo puedo hacerles pensar." - Sócrates.

22 thoughts on “Programación Android, BroadcastReceiver

  1. Hola, muy claro y sencillo de entender el articulo, de verdad muy útil.
    una pregunta, estoy detectando la pulsación y movimientos de un mouse que tengo conectado vía un cable USB. Y lo hice porque necesito contar la cantidad de veces que se hace click en el botón izquierdo. Hasta allí esta ok.
    Necesito enviar vía un intent hacia un bradcastReceiver este valor de la cantidad de click que coy contando, pero no me funciona. La pregunta es: el sendBroadcast debo hacerlo siempre desde una activity, o puede ser cualquier class? actualmente estoy enviandolo desde una clase que no es ni un activity ni un service… y la verdad no me funciona…
    Muchas gracias

    1. Una clase que hayas creado tú no contiene el método sendBroadcast (al menos que herede de otra que sí lo tenga), por lo que no podrías utilizarlo. Una solución es que tu clase contenga un objeto Context e inicializarlo en el constructor (pasando en el constructor el context) para poder hacer context.sendBroadcast(…).

      Un saludo.

  2. Hola, muchas d gracias por la publicacion.

    pregunta … si programmo notificaciones … cuando las abro necesito un reciever para ello?
    Que pasa si tambien necesito programar la ejecucion de un servicio?

    ambas cosas (consumo del servicio y la emission de la notificacion) debe generarse en el mismo instante…
    Necesito dos recibidores?

    Por otro lado quisiera que el servicio se consuma a horas especifics del dia todos los dias… como lo haria?

    Un mismo recibidor puede tener asociadas varias intentes /acciones ?

    1. Buenas Alicia,

      Puedes mostrar la notificación y lanzar el servicio en el método onReceive de tu BroadcastReceiver, es del todo innecesario configurar dos BroadcastReceivers para recoger el mismo evento.

      Un saludo.

  3. Hola. gracias por el tutorial.
    tengo una pregunta como haria para poder detectar la pulsacion del boron power del celular cuando esta en reposo… ? si me puedes ayudar este es mi correo iatecp@gmail.com

    mil gracias

  4. Disculpa de nuevo la molestia. sabes como puedo agregar un nuevo cliente al servidor por medio de la aplicacion android y como guardar las conversaciones en este. mi idea si es crear una aplicacion de chat. De antemano gracias

    1. Para crear un chat en Android lo mejor es que primero aprendas a hacerlo con Java. Un tutorial aquí:
      http://aflrovvs.blogspot.com.es/2012/07/como-hacer-un-chat-con-sockets-en-java.html

      Y después te lo lleves a tu cliente Android, donde sólo tendrás que crear tu UI, porque la lógica al final es la misma que en Java. Un tutorial sencillo aquí:
      http://towhidz.wordpress.com/2012/03/03/simple-chat-applicationclient-server-in-android/
      Cambia los datos del servidor por los de tu propio servidor y listo.

      El tema de guardar la conversación, no tienes más que guardar los mensajes en la base de datos cada vez que el cliente envía o recibe un mensaje, añadirlo a archivos de texto, o cualquier solución que quieras darle.

      Para hacer cosas más elaboradas no hay nada como investigar, buscar en google las cosas específicas que necesites y echar horas picando código… Es la única manera en que podrás llevar adelante cualquier proyecto y de aprender :)

      Un saludo.

    1. Para eso tendrías que tener un servidor de sms, o contratar los servicios de alguno.

      A menos que te refieras a crear un programa del estilo de whatsapp o telegram, o algún chat. Para los primeros busca información sobre GCM (Google Cloud Message), para un chat tienes muchos tutoriales en internet sobre cómo crear un chat cliente-servidor.

      Un saludo.

  5. Hola,
    Tengo una pregunta estoy intentando hacer un servicio que lance una notificación cada ves que se agregue un nuevo registro en la base de datos esto se hace con un BroadCastReciever o hay otra forma de hacerlo te agradecería si me puedes ayudar

    1. Buenas Doriana, no sé si te refieres a un servicio que esté sincronizando la BD local con otra BD en un servidor, o te refieres a gestión interna de la propia aplicación.

      En cualquier caso, si tu intención es mostrar la notificación al agregar un nuevo registro en la BD, tendrás que montar la propia notificación y mostrarla a través del NotificationManager en el punto en el que agregas ese registro. Para esto no necesitas un BroadcastReceiver, porque tienes tú en el código exactamente el punto en el que añades el nuevo registro.

      El BroadcastReceiver está más bien diseñado para poder recoger “señales” externas a la aplicación, como el hecho de conectar un cargador, que el dispositivo entre en suspensión, que se le envíe un mensaje desde otra aplicación, etc. Pero como en este caso ya tienes un punto en el que añades el nuevo registro, no hay mensaje externo y puedes crear y mostrar la notificación sin necesidad del BroadcastReceiver.

      Espero haber aclarado tu duda, un saludo :)

        1. En el caso de que la BD sea externa y lo que quieres es que o se lance notificación cuando la aplicación no esté abierta, o se actualice la pantalla cuando esté abierta, te vendría bien implementar el Google Cloud Message, para recibir los avisos desde el servidor y o bien mandar el aviso a la Activity para que se refresque la pantalla o bien mostrar la notificación.

          En internet podrás encontrar bastantes ejemplos sobre cómo utilizar el GCM en tu proyecto :)

Deja un comentario