Receptores de anuncios


Un receptor de anuncios (BroadcastReceiver) recibe y reacciona ante anuncios globales de tipo broadcast. Existen muchos originados por el sistema; como por ejemplo Batería baja, llamada entrante,... Se muestra una tabla mas adelante. Aunque, las aplicaciones también puede lanzar unanuncio broadcast. Los receptores de anuncios no tienen interfaz de usuario, aunque pueden iniciar una actividad o creara una notificación para informar al usuario.

El ciclo de vida de un BroadcastReceiver es muy sencillo solo dispone del método onReceive(). De hecho un objeto BroadcastReceiver sólo existe durante la llamada a onReceive(). El sistema crea el BroadcastReceiver llama a este método y cuando termina destruye el objeto. Un detalle importante es que no hace falta tener la aplicación en marcha donde se define el BroadcastReceiver para que este se active.

El método onReceive() es ejecutado por el hilo principal de la aplicación. Por lo tanto no puede bloquear al sistema (Ver ciclo de vida de una actividad). Si tienes que realizar una acción que puede bloquear al sistema tendrás que lanzar un hilo secundario. Si queremos una acción persistente en el tiempo resulta muy frecuente lanzar un servicio. Desde un BroadcastReceiver no puedes mostrar un cuadro de diálogo o unirse a un servicio (bindService()). Para lo primero, en su lugar puedes lanzar una notificación. Para lo segundo, puede utilizar startService() para arrancar un servicio.

Una aplicación puede registrar un receptor de anuncios de dos maneras: En AndroidManifest.xml y en tiempo de ejecución mediante el método registerReceiver().

Receptor de anuncios registrado en AndroidManifest.xml

Registrar un receptor de anuncios desde AndroidManifest.xml es muy sencillo. No tienes más que introducir las siguientes líneas en AndroidManifest.xml dentro de la etiqueta <aplication>:

<receiver android:name=".ReceptorAnuncio" >

   <intent-filter>

      <action android:name="android.intent.BATTERY_LOW"/>

   </intent-filter>

</receiver>

En segundo lugar tienes que crear la clase ReceptorAnuncio. El método onReceive() será llamado cuando el sistema lance el anuncio broadcast BATTERY_LOW, esto ocurrirá cuando detecte un nivel bajo de batería.

public class ReceptorAnuncio extends BroadcastReceiver {

    @Override

    public void onReceive(Context context, Intent intent) {

        //...

    }

}

 

Ejercicio paso a paso: Un receptor de anuncios

Primero has de realizar el ejercicio: “Las notificaciones de la barra de estado”.

1. Crea un nuevo proyecto con los siguientes datos:

Application Name: Llamada Entrante

Package Name: org.example.llamadaentrante

Minimun Requiered SDK: API 8: Android 2.2 (Froyo)

 

2. Edita AndroidManifest.xml  y añade dentro de la etiqueta <aplication>las siguientes líneas:

<receiver android:name="ReceptorLlamadas" >

    <intent-filter>

<action android:name="android.intent.action.PHONE_STATE" />

    </intent-filter>

</receiver>

De esta forma registramos un receptor de anuncios que se activará cuando se produzca una llamada

3. Tenemos que pedir permiso para leer el estado del teléfono. Añade la siguiente línea dentro de <manifest>.

<uses-permission

             android:name="android.permission.READ_PHONE_STATE"/>

4. Crea una nueva clase con nombre ReceptorLlamadas y el siguiente código:

public class ReceptorLlamadas extends BroadcastReceiver {

       @Override

       public void onReceive(Context context, Intent intent) {

             // Sacamos información del intent

             String estado = "", numero = "";

             Bundle extras = intent.getExtras();

             if(extras != null) {

                    estado = extras.getString(TelephonyManager.EXTRA_STATE);

                    if(estado.equals(TelephonyManager.EXTRA_STATE_RINGING)) {

                           numero = extras.getString( TelephonyManager.EXTRA_INCOMING_NUMBER);

                    }

             }

             String info = estado + " "+ numero;

             Log.d("ReceptorAnuncio", info + " intent="+ intent);

             // Creamos Notificación

             NotificationManager nm = (NotificationManager) context.getSystemService( Context.NOTIFICATION_SERVICE);

             Notification notificacion = new Notification( R.drawable.ic_launcher,"Llamada entrante", System.currentTimeMillis());

             PendingIntent intencionPendiente = PendingIntent.getActivity( context, 0, new Intent(context, LlamadaEntranteActivity.class), 0);

             notificacion.setLatestEventInfo(context, "Llamada entrante", info, intencionPendiente);

             nm.notify(1, notificacion);

       }

}

5. Ejecuta la aplicación e introduce una llamada. Si utilizas el emulador puedes utilizar la vista EmulatorControl.

6. Verifica que se crea la notificación.

7. Abre la notificación y verifica la información mostrada:

8. Con el administrador de tareas detén la aplicación. Verifica que el receptor de anuncios funciona igual aunque la aplicación no esté en marcha.


Recursos adicionales: Algunos anuncios broadcast

Lista de los anuncios broadcast más importantes organizados por temas. (No Manifest): No se puede declarar el receptor de anuncios en AndroidManifest.xml. Solo se puede utilizar registerReceiver(). (Solo sistema): Intención protegida que solo puede ser lanzada por el sistema.

                

Nombre de la acción /(CONSTANTE)

Descripción / Permiso (INFORMACIÓN EXTRA EN INTENT)

Batería

 

android.intent.action.BATTERY_LOW

(ACTION_BATTERY_LOW)

Batería baja

(Solo sistema)

android.intent.action.BATTERY_OKAY

(ACTION_BATTERY_OKAY)

Batería correcta después de haber estado baja

(Solo sistema)

android.intent.action.ACTION_POWER_CONNECTED

(ACTION_POWER_CONNECTED)

La alimentación se ha conectado

(Solo sistema)

android.intent.action.ACTION_POWER_DISCONNECTED (ACTION_POWER_DISCONNECTED)

La alimentación se ha desconectado

(Solo sistema)

android.intent.action.BATTERY_CHANGED

(ACTION_BATTERY_CHANGED)

Cambia el estado de la batería

(No Manifest) (Solo sistema)

Sistema

 

android.intent.action.BOOT_COMPLETED

(ACTION_BOOT_COMPLETED)

sistema operativo cargado.

Permiso RECEIVE_BOOT_COMPLETED

(Solo sistema)

android.intent.action.ACTION_SHUTDOWN

(ACTION_SHUTDOWN)

El dispositivo va a ser desconectado

(Solo sistema)

android.intent.action.AIRPLANE_MODE

(ACTION_AIRPLANE_MODE_CHANGED)

modo vuelo activo

(Solo sistema)

android.intent.action.TIME_TICK (ACTION_TIME_TICK)

Se envía cada minuto.

(No Manifest) (Solo sistema)

android.intent.action.TIME_SET (ACTION_TIME_CHANGED)

La fecha/hora es modificada

(Solo sistema)

android.intent.action.CONFIGURATION_CHANGED

(ACTION_CONFIGURATION_CHANGED)

Cambia la configuración del dispositivo

(orientación, idioma,..)

(No Manifest) (Solo sistema)

Entradas y pantalla

 

android.intent.action.SCREEN_OFF (ACTION_SCREEN_OFF

La pantalla se apaga (Solo sistema)

android.intent.action.SCREEN_ON

(ACTION_SCREEN_ON)

La pantalla se enciende (Solo sistema)

android.intent.action.CAMERA_BUTTON (ACTION_CAMERA_BUTTON)

Se pulsa el botón de la cámara.

(EXTRA_KEY_EVENT)

android.intent.action.HEADSET_PLUG (ACTION_HEADSET_PLUG)

Se conectan los auriculares

(extras: state, name, microphone)

android.intent.action.INPUT_METHOD_CHANGED (ACTION_INPUT_METHOD_CHANGED)

Cambia método de entrada

android.intent.action.USER_PRESENT (ACTION_USER_PRESENT)

El usuario está presente después de que se active el dispositivo (Solo sistema)

Memoria y Escaner Multimedia

 

android.intent.action.DEVICE_STORAGE_LOW (ACTION_DEVICE_STORAGE_LOW)

Queda poca memoria

(Solo Sistema) (Solo sistema)

android.intent.action.DEVICE_STORAGE_OK (ACTION_DEVICE_STORAGE_OK)

Salimos de la condición de poca memoria

(Solo Sistema) (Solo sistema)

android.intent.action.MEDIA_EJECT (ACTION_MEDIA_EJECT)

El usuario pide extraer almacenamiento exterior

android.intent.action.MEDIA_MOUNTED (ACTION_MEDIA_MOUNTED)

Almacenamiento exterior disponible

android.intent.action.MEDIA_REMOVED (ACTION_MEDIA_REMOVED)

Almacenamiento exterior no disponible

android.intent.action.MEDIA_SCANNER_FINISHED (ACTION_MEDIA_SCANNER_FINISHED)

El escáner de medios termina un directorio (se indica en Intent.mData)

android.intent.action.MEDIA_SCANNER_SCAN_FILE (ACTION_MEDIA_SCANNER_SCAN_FILE)

El escáner de medios encuentra un fichero (se indica en Intent.mData)

android.intent.action.MEDIA_SCANNER_STARTED (ACTION_MEDIA_SCANNER_STARTED)

El escáner de medios comienza un directorio (se indica en Intent.mData)

Aplicaciones

 

android.intent.action.MY_PACKAGE_REPLACED (ACTION_MY_PACKAGE_REPLACED)

Una nueva version de tu aplicación ha sido instalada

(Solo sistema)

android.intent.action.PACKAGE_ADDED (ACTION_PACKAGE_ADDED)

Una nueva aplicación instalado

(EXTRA_UID, EXTRA_REPLACING)

(Solo sistema)

android.intent.action.PACKAGE_FIRST_LAUNCH (ACTION_PACKAGE_FIRST_LAUNCH)

Primera vez que se lanza una aplicación

(Solo sistema)

android.intent.action.PACKAGE_REMOVED (ACTION_PACKAGE_REMOVED)

Se desinstala una aplicación

(Solo sistema)

Comunicaciones y redes

 

android.intent.action.PHONE_STATE

llamada de teléfono. Permiso: READ_PHONE_STATE(EXTRA_STATE,EXTRA_STATE_RINGING)

android.intent.action.NEW_OUTGOING_CALL (ACTION_NEW_OUTGOING_CALL)

Se va ha hacer una llamada. Permiso  PROCESS_OUTGOING_CALLS(EXTRA_PHONE_NUMBER) (Solo sistema)

android.provider.Telephony.SMS_RECEIVED

SMS recibido. Permiso: RECEIVE_SMS

android.bluetooth.intent.action.DISCOVERY_STARTED

comienza escáner Bluetooth

android.bluetooth.intent.action.ENABLED

Bluetooth habilitado

android.net.wifi.NETWORK_IDS_CHANGED (NETWORK_IDS_CHANGED_ACTION)

Cambia la red WiFi

android.net.wifi.STATE_CHANGE (NETWORK_STATE_CHANGED_ACTION)

Cambia la conectividad WiFi (EXTRA_NETWORK_INFO, EXTRA_BSSID, EXTRA_WIFI_INFO)

android.net.wifi.RSSI_CHANGED (RSSI_CHANGED_ACTION)

Cambia el nivel de señal WiFi (EXTRA_NEW_RSSI)


{jcomments on}