broadcastreceiver. base class for components that receive and react to events events are...
Post on 19-Dec-2015
231 views
TRANSCRIPT
![Page 1: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/1.jpg)
Programming the Android Platform
BroadcastReceiver
![Page 2: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/2.jpg)
Broadcast Receiver
Base class for components that receive and react to events
Events are represented as Intent objects
Intents received as parameter to onReceive() method
BroadcastReceivers have no user interface
![Page 3: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/3.jpg)
BroadcastReceiver Use Case
Register BroadcastReceiver for specific events
Broadcast an event Android identifies recipients &
delivers event by calling BroadcastReceiver.onReceive()
Event handled in on Receive()
![Page 4: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/4.jpg)
Registering BroadcastReceivers
Statically AndroidManifest.XML
Dynamically Context.registerReceiver()
![Page 5: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/5.jpg)
Static Registration
Include <receiver> in AndroidManifest.xml<application> <receiver receiver specs > <intent-filter> event specs </intent-filter> </receiver></application>
Receiver registered at boot time or when application package is added
![Page 6: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/6.jpg)
Static Registration (cont.)<application …> <activity android:name=".SimpleBroadcast” …> …
</activity> <receiver android:name=".Receiver2"> <intent-filter android:priority=”5"> <action android:name=
"course.examples.BroadcastReceiver.intent.action.TEST2”> </action>
</intent-filter> </receiver> </application> <uses-permission
android:name="android.permission.VIBRATE"></uses-permission>
![Page 7: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/7.jpg)
Dynamic Registration
Create an IntentFilter Create a BroadcastReceiver Register BroadcastReceiver to receive
Intents using Context.registerReceiver()
When appropriate call Context.unRegisterReceiver() to unRegister BroadcastReceiver
![Page 8: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/8.jpg)
Dynamic Registration (cont.)public class SingleBroadcast extends Activity { public static final String CUSTOM_INTENT =
"course.examples.BroadcastReceiver.intent.action.TEST1"; public void onCreate(Bundle savedInstanceState) { … registerReceiver(new Receiver1(),
new IntentFilter(CUSTOM_INTENT)); }}
![Page 9: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/9.jpg)
Event Broadcast
Several broadcast methods supported Normal vs. Ordered
Normal: processing order undefined Ordered: sequential processing in priority
order Sticky vs. Non-Sticky
Sticky: Store Event after initial broadcast Non-Sticky: Discard Event after initial
broadcast With or without receiver permissions
![Page 10: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/10.jpg)
Normal Broadcasts
//public abstract class Context …
// send Intent to interested BroadcastReceiversvoid sendBroadcast (Intent intent)
// send Intent to interested BroadcastReceivers// if they have the specified permissionsvoid sendBroadcast (Intent intent, String
receiverPermission)
![Page 11: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/11.jpg)
Normal Broadcasts (cont.)public class SimpleBroadcast extends Activity { public static final String CUSTOM_INTENT =
"course.examples.BroadcastReceiver.intent.action.TEST2"; public void onCreate(Bundle savedInstanceState) { … Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { sendBroadcast(new Intent(CUSTOM_INTENT),
android.Manifest.permission.VIBRATE); } }); }}
![Page 12: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/12.jpg)
Ordered Broadcasts
//public abstract class Context …
// send Intent to interested BroadcastReceivers in priority ordervoid sendOrderedBroadcast (Intent intent,
String receiverPermission)
// send Intent to interested BroadcastReceivers in priority order// sender can provide various parameters for greater controlvoid sendOrderedBroadcast (Intent intent,
String receiverPermission, BroadcastReceiver resultReceiver,
Handler scheduler, int initialCode, String initialData, Bundle initialExtras)
![Page 13: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/13.jpg)
Ordered Broadcasts (cont.)public class CompoundOrderedBroadcast extends Activity { … public static final String CUSTOM_INTENT =
"course.examples.BroadcastReceiver.intent.action.TEST4"; public void onCreate(Bundle savedInstanceState) { … Button.setOnClickListener(new OnClickListener() { public void onClick(View v) { sendOrderedBroadcast(new Intent(CUSTOM_INTENT),
android.Manifest.permission.VIBRATE);
} }); …}
![Page 14: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/14.jpg)
Ordered Broadcasts (cont.)public class CompoundOrderedBroadcastWithResultReceiver
extends Activity { public void onCreate(Bundle savedInstanceState) { … button.setOnClickListener(new OnClickListener() { public void onClick(View v) { sendOrderedBroadcast(
new Intent(CUSTOM_INTENT), null, new BroadcastReceiver() { public void onReceive(Context context, Intent
intent) { System.out.println("Final Result is:" +
getResultData()); } }, null, 0, null, null); } });…
![Page 15: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/15.jpg)
Sticky Broadcasts
Events sent as sticky broadcasts are cached by Android New intents overwrite older intents they
match When later a BroadcastReceiver is
registered dynamically Cached sticky Intents matching the
specified IntentFilter are broadcast to the BroadcastReceiver
One matching sticky Intent is returned to the caller
![Page 16: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/16.jpg)
Sticky Broadcasts (cont.)//public abstract class Context …// send sticky Intent to interested BroadcastReceiversvoid sendStickyBroadcast (Intent intent)
// send sticky Intent to interested BroadcastReceivers in priority order// sender can provide various parameters for greater control
void sendStickyOrderedBroadcast (Intent intent, BroadcastReceiver resultReceiver,Handler scheduler, int initialCode, String initialData, Bundle initialExtras)
Must have BROADCAST_STICKY permission to send sticky Intents
![Page 17: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/17.jpg)
Intent Filter Matching
Similar to matching for Activities & Services Some debugging tips Log BroadcastReceivers that match an
Intent Intent.setFlag(FLAG_DEBUG_LOG_RESOLUTION)
Print BroadcastReceivers registered to receive intents Dynamic registration▪ % adb shell dumpsys activity b
Static registration▪ % adb shell dumpsys package
![Page 18: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/18.jpg)
Event Delivery
Events delivered by calling onReceive()
![Page 19: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/19.jpg)
Event Handling in onReceive() onReceive() should be short-lived
Hosting process has high priority while onReceive() is executing & is often when onReceive() returns
If event handling take a long time, consider starting a Service, rather than performing complete operation in onReceive()
BroadcastReceivers can’t start asynchronous operations e.g., showing a dialog, binding to a Service,
starting an Activity via startActivityForResult
![Page 20: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/20.jpg)
Handling a Normal Broadcast
public class Receiver1 extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { System.out.println(this + ":GOT THE INTENT"); // emulator doesn't support vibration Vibrator v = (Vibrator)
context.getSystemService(Context.VIBRATOR_SERVICE); v.vibrate(500); }}
![Page 21: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/21.jpg)
Handling an Ordered Broadcast
• Passing resultspublic class Receiver1 extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { String tmp = getResultData() != null ? getResultData() :
""; setResultData(tmp + ":Receiver 1:"); }}
![Page 22: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/22.jpg)
Handling an Ordered Broadcast
• Aborting the broadcastpublic class Receiver2 extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { if (isOrderedBroadcast()) { abortBroadcast(); } System.out.println(this + ":GOT THE INTENT"); // emulator doesn't support vibration Vibrator v = (Vibrator) context .getSystemService(Context.VI
BRATOR_SERVICE); v.vibrate(500); }}
![Page 23: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/23.jpg)
Handling a Sticky Broadcastpublic class StickyIntentBroadcastReceiverActivity extends
Activity { public void onCreate(Bundle savedInstanceState) { registerReceiver(new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(
Intent.ACTION_BATTERY_CHANGED)) { String age = "Reading taken recently"; if (isInitialStickyBroadcast()) { age = "Reading may be
stale”; } state.setText("Current Battery Level" +
String.valueOf( intent. getIntExtra(BatteryManager.EXTRA_LEVEL, -1)) + "\n" + age);
} } }, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); }}
![Page 24: BroadcastReceiver. Base class for components that receive and react to events Events are represented as Intent objects Intents received as parameter](https://reader035.vdocuments.mx/reader035/viewer/2022062421/56649d2c5503460f94a02f7c/html5/thumbnails/24.jpg)
Lab Assignment