Android Broadcast Receiver

Un broadcast receiver este o componentă Android care permite identificarea diferitelor evenimente generate de sistem sau de o aplicaţie. Fiecare “ascultător” înregistrat pentru un anumite eveniment va fi notificat de sistem imediat ce evenimentul respectiv apare.

Exemple:

Eveniment Utilizare
Intent.ACTION_BATTERY_LOW nivelul de incărcare al bateriei a scăzut
Intent.ACTION_BATTERY_OKAY nivelul de incărcare al bateriei este în parametrii normali
Intent.ACTION_BOOT_COMPLETED sistemul este pregătit să funcţioneze în paramterii normali
Intent.ACTION_DEVICE_STORAGE_LOW spaţiul de memorie este limitat
Intent.ACTION_DEVICE_STORAGE_OK spaţiul de memorie este în regulă
Intent.ACTION_HEADSET_PLUG a fost deconectat sau conectat device-ul
Intent.ACTION_LOCALE_CHANGED utilizatorul a modificat setările de limbă
Intent.ACTION_MY_PACKAGE_REPLACED aplicaţia a fost modificată
Intent.ACTION_PACKAGE_ADDED o nouă aplicaţie a fost instalată
Intent.ACTION_POWER_CONNECTED device-ul a fost conectat pentru a fi încărcat
Intent.ACTION_POWER_DISCONNECTED device-ul a fost deconectat
KeyChain.ACTION_STORAGE_CHANGED tastatură modificată
BluetoothDevice.ACTION_ACL_CONNECTED o conexiune Bluetooth ACL a fost stabilită
etc.

Implementare:

Pentru a implementa un ascultător de tip Broadcast Receiver trebuie să extindem clasa BroadcastReceiver (o mare surpriză, nu-i aşa!? ). De asemenea, aceasta clasă utilizată în cadrul aplicaţiei, ca ascultător pentru un anumit eveniment, trebuie să fie declarată şi în manifest sau în cod, în cazul în care asignăm un broadcast receiver unei activităţi.

Aşadar, există 2 modalităţi de a implementa un broadcast receiver:
1. ca o clasă separată care extinde BroadcastReceiver şi care va fi declarată in manifest:


public class MyReceiver extends BroadcastReceiver
{
 @Override
 public void onReceive(Context context, Intent intent)
 {

 }
}


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

    <uses-sdk android:minSdkVersion="15" />

<application>
....
<receiver android:name=".MyReceiver" >
            <intent-filter>
                <action android:name="com.example.android.mybroadcast" />
            </intent-filter>
        </receiver>
    </application>

</manifest></p>

2. în cadrul unei activităţi:


//...
public class AndroidActivity extends Activity {
    private BroadcastReceiver mReceiver;
//...

//AndroidActivity.java
//...
    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        IntentFilter intentFilter = new IntentFilter(
                "android.intent.action.MAIN");
        mReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                //extract our message from intent
                String msg_for_me = intent.getStringExtra("some_msg");
                //log our message value
                Log.i("test", msg_for_me);
            }
        };
        //registering our receiver
        this.registerReceiver(mReceiver, intentFilter);
    }
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        //unregister our receiver
        this.unregisterReceiver(this.mReceiver);
    }
//...

Exemplu:

Un bun exemplu pentru a evidenţia conceptul de Broadcast Receiver este reprezentat de  evenimentul înregistrat în momentul când este primit un SMS. Acţiunea specifică: android.provider.Telephony.SMS_RECEIVED.

SMSBroadcastReceiver.java


package org.magdabadita.broadcastsms;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Vibrator;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;

public class SMSBroadcastReceiver extends BroadcastReceiver
{

public void onReceive( Context context, Intent intent )
 {
 Bundle extras = intent.getExtras();

String messages = "", address = "";

if ( extras != null )
 {
 Object[] smsExtra = (Object[]) extras.get("pdus");
 for ( int i = 0; i < smsExtra.length; ++i )
 {
 SmsMessage sms = SmsMessage.createFromPdu((byte[])smsExtra[i]);

String body = sms.getMessageBody().toString();
 address = sms.getOriginatingAddress();

messages += "SMS from " + address + " :\n";
 messages += body + "\n";
 }
 Toast.makeText( context, messages, Toast.LENGTH_SHORT ).show();
 }
 }
}

Manifest.xml


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

<uses-sdk android:minSdkVersion="7" />

<uses-permission android:name="android.permission.INTERNET" >
 </uses-permission>
 <uses-permission android:name="android.permission.RECEIVE_SMS" >
 </uses-permission>
 <uses-permission android:name="android.permission.READ_SMS" >
 </uses-permission>
<application
 android:icon="@drawable/ic_launcher"
 android:label="@string/app_name" >
 <activity
 android:name=".SMSBroadcastReceiverActivity"
 android:label="@string/app_name" >
 <intent-filter>
 <action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>
 </activity>
 <activity
 android:name=".SMSReceivedActivity"
 android:screenOrientation="portrait" >
 </activity>

<receiver android:name=".SMSBroadcastReceiver" >
 <intent-filter>
 <action android:name="android.provider.Telephony.SMS_RECEIVED" >
 </action>
 </intent-filter>
 </receiver>
 </application>

</manifest>

Workflow-ul realizat este foarte simplu: atunci când este primit un SMS este lansat un Toast conţinând numărul de telefon al transmiţătorului si textul mesajului.

Pentru a simula acţiunea de a trimite un SMS se poate utiliza şi emulatorul Android. Din DDMS se selectează simulatorul, iar din fereastra “Emulator Control” se adaugă un număr de telefon şi textul SMS-ului.

Cam aceasta este povestea despre Broadcast Receiver. Aştept feedback şi propuneri de teme pe care să le abordez în tutorialele următoare! 🙂

Advertisements
Android Broadcast Receiver

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s