範例 – 接收系統廣播

範例 – 接收系統廣播

一、廣播(Broadcast)基礎概念

1. 什麼是系統廣播

  • Android 內建大量系統層級廣播,用來通知系統狀態變化
  • 常見系統廣播:
    • 電量低 / 電量變化
    • 開機完成(BOOT_COMPLETED)
    • 網路狀態變化(CONNECTIVITY_CHANGE)
    • 飛航模式切換
    • 時間/時區變化

2. 廣播接收器的作用

  • 應用程式透過註冊廣播接收器,監聽感興趣的廣播
  • 當廣播送達時,系統會自動呼叫接收器的 onReceive() 方法
  • 在 onReceive() 內撰寫業務邏輯

二、廣播的兩種註冊方式

比較項目動態註冊(程式碼註冊)靜態註冊(Manifest 註冊)
註冊位置Activity / Service 等元件內AndroidManifest.xml
生命週期與註冊的元件綁定獨立於元件,應用未啟動也能接收
彈性高,可隨時註冊/取消註冊低,安裝時就已確定
適用場景需要感知元件生命週期的廣播全域廣播、開機自啟等
高版本限制無特殊限制Android 8.0+ 對隱式廣播有許多限制

重要:CONNECTIVITY_CHANGE(網路變化)廣播在 Android 7.0+ 禁止靜態註冊,必須使用動態註冊。

三、建立廣播接收器

基本步驟

  1. 建立新類別,繼承 BroadcastReceiver
  2. 覆寫 onReceive(Context context, Intent intent) 方法
  3. 在 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)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *