範例 – 接收系統廣播
一、廣播(Broadcast)基礎概念
1. 什麼是系統廣播
- Android 內建大量系統層級廣播,用來通知系統狀態變化
- 常見系統廣播:
- 電量低 / 電量變化
- 開機完成(
BOOT_COMPLETED) - 網路狀態變化(
CONNECTIVITY_CHANGE) - 飛航模式切換
- 時間/時區變化
2. 廣播接收器的作用
- 應用程式透過註冊廣播接收器,監聽感興趣的廣播
- 當廣播送達時,系統會自動呼叫接收器的
onReceive()方法 - 在
onReceive()內撰寫業務邏輯
二、廣播的兩種註冊方式
| 比較項目 | 動態註冊(程式碼註冊) | 靜態註冊(Manifest 註冊) |
|---|---|---|
| 註冊位置 | Activity / Service 等元件內 | AndroidManifest.xml |
| 生命週期 | 與註冊的元件綁定 | 獨立於元件,應用未啟動也能接收 |
| 彈性 | 高,可隨時註冊/取消註冊 | 低,安裝時就已確定 |
| 適用場景 | 需要感知元件生命週期的廣播 | 全域廣播、開機自啟等 |
| 高版本限制 | 無特殊限制 | Android 8.0+ 對隱式廣播有許多限制 |
重要:
CONNECTIVITY_CHANGE(網路變化)廣播在 Android 7.0+ 禁止靜態註冊,必須使用動態註冊。
三、建立廣播接收器
基本步驟
- 建立新類別,繼承
BroadcastReceiver - 覆寫
onReceive(Context context, Intent intent)方法 - 在
onReceive()內處理收到的廣播邏輯
程式碼
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 處理廣播邏輯
}
}Code language: PHP (php)
四、動態註冊完整流程
1. 定義成員變數
private NetworkChangeReceiver networkChangeReceiver;
private IntentFilter intentFilter;Code language: PHP (php)
2. 在 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. 在 onDestroy() 取消註冊(必要!)
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}Code language: CSS (css)
4. 定義接收器內部類別
class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "網路已變更", Toast.LENGTH_LONG).show();
}
}Code language: JavaScript (javascript)
Previous: 認識 Android 廣播
Next: Android 網路斷線/連線廣播監聽