There are two types
of broadcasts in Android: normal and
ordered. The following table shows the
main differences:
Normal
|
Ordered
|
|
Way of delivery
|
Normal broadcasts are delivered to the
available receivers asynchronously, in an unspecified
order
|
Ordered broadcasts are delivered to the
available receivers one at a time, in a specified
order (the order depends on the
android:priority attribute of the different receivers in the
AndroidManifest file)
|
Feedback
|
With normal broadcasts no
feedback can be sent to the
broadcaster
|
With ordered broadcasts the receiver can
send information to the broadcaster
(using the methods abortBroadcast(), seResultCode(),
setResultData()
|
Tip:
in a receiver (handling ordered broadcasts) you can call the method
abortBroadcast() to make sure that the broadcast is not sent to other
receivers. If you combine this method with a high value for the
android:priority attribute, you can make sure that your receiver is
the only one to handle that broadcast (SMS apps can use this
technique).
BroadcastReceiver in Android |
BroadcastReceiver
Let’s see how a
BroadcastReceiver can handle ordered
broadcasts (se the comments in the code
for more information):
public class MyReceiver extends BroadcastReceiver {
[...]
public void onReceive(Context context, Intent intent) {
//is this an ordered broadcast or not?
if(isOrderedBroadcast() {
//here you can handle the broadcast
[...]
//here you can send information back to the broadcaster
setResultCode(Activity.RESULT_OK);
setResultData(“here you can pass a String”);
//you can also create complex data to send to the broadcaster
Bundle myBundle = getResultExtras(true);
myBundle.put [...] //code omitted for brevity
}
}
}
Broadcaster
Sending an
ordered broadcast is quite simple.
Let’s look at the code:
Intent int = new Intent(YOUR_FILTER);
sendOrderedBroadcast(int, responseReceiver, null, RESULT_OK, null, null);
As you can see you
just have to create an Intent
with the filter registered for the BroadcastReceiver MyReceiver and
call the method sendOrderedBroadcast. This method takes a
BroadcastReceiver (responseReceiver)
as a parameter: this is the receiver that will receive the
information sent back by the BroadcastReceiver MyReceiver.
So you finally have
to register the BroadcastReceiver responseReceiver (to
handle the results) in the following
way:
BroadcastReceiver responseReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//here you can retrieve the results sent by MyReceiver
String str = getResultData();
//here you can retrieve the complex data sent by MyReceiver
Bundle myBundle = getResultExtras(false);
if(myBundle != null) {
//here you can retrieve the data using myBundle.get... methods
}
}
}