Android 廣播(Broadcast)屬於系統級訊息總線,元件之間透過 Intent 攜帶資料進行跨進程通訊。要將廣播資料傳遞給 Activity,需完成「發送廣播 → 註冊接收器 → 在接收器中啟動/更新 Activity」三步驟。
Intent intent = new Intent("com.example.CUSTOM_ACTION");
intent.putExtra("key_message", "來自廣播的資料");
intent.putExtra("key_number", 123);
sendBroadcast(intent); // 或 sendOrderedBroadcast() 依需求
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if ("com.example.CUSTOM_ACTION".equals(intent.getAction())) {
String msg = intent.getStringExtra("key_message");
int num = intent.getIntExtra("key_number", 0);
// 更新 UI 或儲存資料
runOnUiThread(() -> tvResult.setText(msg + " / " + num));
}
}
};
@Override
protected void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter("com.example.CUSTOM_ACTION");
registerReceiver(mReceiver, filter);
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(mReceiver);
}
<receiver android:name=".MyBroadcastReceiver" android:exported="true">
<intent-filter>
<action android:name="com.example.CUSTOM_ACTION" />
</intent-filter>
</receiver>
在 MyBroadcastReceiver.onReceive() 中啟動目標 Activity:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent actIntent = new Intent(context, TargetActivity.class);
actIntent.putExtras(intent); // 直接透傳 Bundle
actIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(actIntent);
}
}
sendOrderedBroadcast() 可讓接收器按優先級處理,並可攔截或修改資料。LiveData/Flow 等架構元件保存最新狀態。| 問題 | 解決方案 |
|---|---|
| 動態註冊未在 onPause 解除 | 導致記憶體洩漏、重複接收;務必成對呼叫 register/unregister |
| 靜態接收器啟動 Activity 缺少 FLAG_ACTIVITY_NEW_TASK | 非 Activity context 啟動 Activity 必須加此旗標 |
| Intent Extra 型別不匹配 | 發送端與接收端使用相同鍵值與型別,建議定義常數類別 |
廣播傳遞資料給 Activity 的關鍵在於:Intent 搭載 Bundle → BroadcastReceiver 解析 → 更新 UI 或啟動 Activity。根據使用場景選擇動態或靜態註冊,並注意生命週期管理與執行緒安全。