This blog i started for sharing information for android developers.I just love to share my knowledge in my spare time and would appreciate any questions or feedback.

Monday, April 28, 2014

Use of BroadCast Receiver in android

Android Tutorials: What is Broadcast Receiver?A broadcast receiver is a dormant component of the Android system.
Only an Intent (for which it is registered) can bring it into action.
The Broadcast Receiver’s job is to pass a notification to the user, in case a specific event occurs.Using a Broadcast Receiver, applications can register for a
particular event. Once the event occurs, the system will notify all the
registered applications.

For instance, a Broadcast receiver triggers battery Low notification that you see on your mobile screen.Other instances caused by a Broadcast Receiver are new friend notifications, new friend feeds, new message etc. on your Facebook app.In fact, you see broadcast receivers at work all the time. Notifications like incoming messages, WiFi Activated/Deactivated message etc. are all real-time announcements of what is happening in the Android system and the applications.

Consider this:

You have an important social gathering to attend.
Because of your shoddy memory, you have requested your friend to notify
you a day before the event. Now, because you have ‘registered’ for the
said friend’s help, you will get a reminder from him as discussed. This
is roughly how the Broadcast Receiver works.

We have also discussed
an example at the end of this Android Tutorial (in the example, a
notification is generated once the system time is changed).

How important is it to implement Broadcast Receivers correctly?

If you wish to create a good Android application, this is of utmost
importance. If the broadcast events do not perform their job (of sending
notifications to support the application’s primary task) perfectly, the
application would not be intuitive and user friendly.

Registration of Broadcast Receiver

There are two ways to register a Broadcast Receiver; one is Static and the other Dynamic.1) Static: Use <receiver> tag in your Manifest file. (AndroidManifest.xml)2) Dynamic: Use Context.registerReceiver () method to dynamically register an instance.

Classes of Broadcasts

The two major classes of broadcasts are:1) Ordered Broadcasts: These broadcasts are synchronous, and therefore follow a specific order. The order is defined using android: priority attribute. The receivers with greater priority would receive the broadcast first.
In case there are receivers with same priority levels, the broadcast
would not follow an order. Each receiver (when it receives the
broadcast) can either pass on the notification to the next one, or abort
the broadcast completely. On abort, the notification would not be
passed on to the receivers next in line.2) Normal Broadcasts: Normal broadcasts are not orderly. Therefore, the registered receivers often run all at the same time. This is very efficient, but the Receivers are unable to utilize the results.Sometimes to avoid system overload, the system delivers the
broadcasts one at a time, even in case of normal broadcasts. However,
the receivers still cannot use the results.

Difference between Activity Intent and Broadcasting Intent

You must remember that Broadcasting Intents are different from the
Intents used to start an Activity or a Service (discussed in previous
Android Tutorials). The intent used to start an Activity makes changes
to an operation the user is interacting with, so the user is aware of
the process. However, in case of broadcasting intent, the operation runs
completely in the background, and is therefore invisible to the user.

Implementing the Broadcast Receiver

You need to follow these steps to implement a broadcast receiver:1) Create a subclass of Android’s BroadcastReceiver2) Implement the onReceive() method: In order
for the notification to be sent, an onReceive() method has to be
implemented. Whenever the event for which the receiver is registered
occurs, onReceive() is called. For instance, in case of battery low
notification, the receiver is registered to Intent.ACTION_BATTERY_LOW
event. As soon as the battery level falls below the defined level, this
onReceive() method is called.Following are the two arguments of the onReceive() method:

Context: This is used to access additional information, or to start services or activities.

Intent: The Intent object is used to register the receiver.

Security

As the broadcast receivers have a global work-space, security is very
important concern here. If you do not define the limitations and
filters for the registered receivers, other applications can abuse them.
Here are a few limitations that might help:

Whenever you publish a receiver in your application’s manifest, make it unavailable to external applications by using android: exported=”false”.
You might think that specifying Intent filters while publishing the
receiver would do the task for you, when in reality they are not enough.

When you send a broadcast, it is possible for the external
applications too to receive them. This can be prevented by specifying a
few limitations.

Similarly, when you register your receiver using registerReceiver, any application may send it broadcasts. This can be prevented using permissions as well.

(PS: As of Android 3.1, the Android system will not receive any external Intent, so the system is comparatively secure now.)

Prolonged Operations

The Broadcast Receiver object is active only for the duration of onReceive (Context, Intent).
Therefore, if you need to allow an action after receiving the notification services should be triggered, and not broadcast receivers.

To show a dialogue, then you should use NotificationManager API

If you wish to send a broadcast intent that would stick around even after the broadcast is complete, you must use sendStickyBroadcast (Intent) method.

Broadcast Receiver Example

In this sample application, a notification is generated when you
change the system time. The notification when clicked leads the user to
the Contacts. This is how the application works: