在代碼中直接 sendBroadcast(new Intent(this, MyReceiver.class)),但 MyReceiver 從未收到廣播。原因:**Intent 應使用 Action 字串識別,而非 Component 類別**(除非明確指定 exported receiver)。
<!-- AndroidManifest.xml -->
<receiver android:name=".MyReceiver" android:exported="false">
<intent-filter>
<action android:name="com.example.MY_CUSTOM_ACTION" />
</intent-filter>
</receiver>
// 發送
Intent intent = new Intent("com.example.MY_CUSTOM_ACTION");
intent.putExtra("key", "value");
sendBroadcast(intent);
// Activity/Service onCreate
MyReceiver receiver = new MyReceiver();
IntentFilter filter = new IntentFilter("com.example.MY_CUSTOM_ACTION");
registerReceiver(receiver, filter);
// onDestroy 解除註冊
unregisterReceiver(receiver);
僅在進程內傳遞,更安全、效率更高:
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
// 註冊
LocalBroadcastManager.getInstance(context).registerReceiver(receiver, filter);
Intent i = new Intent(this, BootUpReceiverRecall.class):這是**顯式 Intent**,會直接啟動該組件,但 sendBroadcast 配合顯式 Intent 只有在接收端 exported="true" 且匹配時才能收到,且不推薦。BootUpReceiverRecall 內又設定 AlarmManager 啟動 BootUpReceiver,邏輯過度複雜。// 直接在需要的地方發送自訂 Action 廣播
Intent intent = new Intent("com.example.ACTION_REFRESH_DATA");
sendBroadcast(intent);
// 或使用 LocalBroadcastManager
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);