Example – Receiving System Broadcasts
1. Basic Concepts of Broadcast
1. What are System Broadcasts
- Android includes many built-in system-level broadcasts to notify applications of system state changes.
- Common system broadcasts:
- Low battery / battery level changes
- Boot completed (
BOOT_COMPLETED) - Network status changes (
CONNECTIVITY_CHANGE) - Airplane mode toggle
- Time / time zone changes
2. Purpose of Broadcast Receivers
- Apps listen for target broadcasts by registering broadcast receivers.
- When a broadcast arrives, the system automatically calls the receiver’s
onReceive()method. - Implement business logic inside the
onReceive()method.
2. Two Registration Methods for Broadcasts
| Comparison Item | Dynamic Registration (Code Registration) | Static Registration (Manifest Registration) |
|---|---|---|
| Registration Location | Inside components such as Activity / Service | AndroidManifest.xml |
| Lifecycle | Bound to the registered component | Independent of components; can receive broadcasts even when the app is not started |
| Flexibility | High; register / unregister at any time | Low; determined at app installation |
| Applicable Scenarios | Broadcasts that need awareness of component lifecycle | Global broadcasts, boot startup, etc. |
| Restrictions on Newer Android Versions | No special restrictions | Android 8.0+ imposes heavy restrictions on implicit broadcasts |
Important: Static registration for the
CONNECTIVITY_CHANGE(network change) broadcast is not allowed on Android 7.0 and above. Dynamic registration must be used instead.
3. Creating a Broadcast Receiver
Basic Steps
- Create a new class that extends
BroadcastReceiver - Override the
onReceive(Context context, Intent intent)method - Write logic to handle incoming broadcasts inside
onReceive()
Code
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Handle broadcast logic
}
}Code language: PHP (php)
4. Full Workflow for Dynamic Registration
1. Define Member Variables
private NetworkChangeReceiver networkChangeReceiver;
private IntentFilter intentFilter;Code language: PHP (php)
2. Register inside onCreate()
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
networkChangeReceiver = new NetworkChangeReceiver();
intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(networkChangeReceiver, intentFilter);
}Code language: JavaScript (javascript)
3. Unregister inside onDestroy() (Mandatory!)
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}Code language: CSS (css)
4. Define Receiver Inner Class
class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Network has changed", Toast.LENGTH_LONG).show();
}
}Code language: JavaScript (javascript)