首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android BroadcastReceiver 未被呼叫:正確註冊與傳送廣播

     編輯:程式設計綜合問答

常見錯誤

在代碼中直接 sendBroadcast(new Intent(this, MyReceiver.class)),但 MyReceiver 從未收到廣播。原因:**Intent 應使用 Action 字串識別,而非 Component 類別**(除非明確指定 exported receiver)。

正確模式

1. 靜態註冊

<!-- 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);

2. 動態註冊

// Activity/Service onCreate
MyReceiver receiver = new MyReceiver();
IntentFilter filter = new IntentFilter("com.example.MY_CUSTOM_ACTION");
registerReceiver(receiver, filter);

// onDestroy 解除註冊
unregisterReceiver(receiver);

3. 本地廣播

僅在進程內傳遞,更安全、效率更高:

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);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved