2012-11-21 77 views
2

我試圖使用BroadcastReceiver接收來自服務的新消息。但廣播接收器總是接收廣播兩次... ... 接收器代碼:爲什麼BroadcastReceiver收到兩個相同的廣播

private class RecentBroadcastReceiver extends BroadcastReceiver { 

    public void onReceive(Context context, Intent intent) { 
     Bundle messageBundle = intent.getExtras(); 
     IChatCSMessage message = (IChatCSMessage) messageBundle.get("message"); 
     String sender = message.getSender().getUserId(); 
     addRecentBuddy(sender.trim()); 
     recentBuddyAdapter.notifyDataSetChanged(); 
     allMessages.get(sender).add(message); 
     Log.i("RECENT_RECEIVER", "RECEIVING MESSAGE:" + message.getMessage()); 
    } 
} 
public void initReceiver() { 
    IntentFilter myIntentFilter = new IntentFilter(); 
    myIntentFilter.addAction("com.ichat.message"); 
    recentBroadcastReceiver = new RecentBroadcastReceiver(); 
    registerReceiver(recentBroadcastReceiver, myIntentFilter); 
} 

廣播是:

Intent intent = new Intent("com.ichat.message"); 
intent.putExtra("message", message); 
IChatClientService.this.sendBroadcast(intent); 

誰能幫助我?

+0

也許你的'initReceiver()'被調用兩次..? – fiddler

+0

@fiddler否,只需要一次 – Lafido

+1

也許你在清單文件中註冊它? – fiddler

回答

0

您確實沒有提供任何證據表明在這兩種情況下Intents都包含相同的擴展數據。我這樣說是因爲:a)你從不記錄傳入的動作,b)你不通過調用getStringExtra()來獲得帶有密鑰「消息」的擴展數據(如果確實該擴展數據的內容是一個字符串),並且c )你不會給我們提供一個logCat清單。

,我建議這些步驟進行調試:

  1. 呼叫Log.i爲傳入意圖動作
  2. 呼叫Log.i爲傳入意圖的價值在「信息」鍵。
  3. 發佈結果。
  4. 後,準確顯示「消息」的類型和值,當你發送廣播意圖

總之,你的廣播接收器的接收兩個意圖,可能既與行動的代號爲「COM .ichat.message」。如果廣播只在您的應用程序中的一個位置,那麼該地點已達到兩次。

0

這是一個常見的錯誤,你可能已經把你的廣播接收器在你的manifest.xml像這樣定義的意圖:

 <receiver android:name="RecentBroadcastReceiver"> 
     <intent-filter> 
      <action android:name="com.ichat.message" /> 
     </intent-filter> 
    </receiver> 

而且也是在你的代碼中創建一個作爲樣本。這實際上是創建兩個意圖過濾器,所以你可以刪除你的XML中的意圖過濾器,你應該只看到一個廣播。

相關問題