为什么BroadcastReceiver收到两个相同的广播

时间:2012-11-21 09:53:15

标签: android broadcastreceiver

我正在尝试使用BroadcastReceiver从服务接收新消息。但BroadcastReceiver总是收到广播TWICE ...... 接收者代码:

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

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

您确实没有提供任何证据证明在两种情况下Intent都包含相同的扩展数据。我之所以这样说是因为a)你从不记录传入的动作,b)你没有通过调用getStringExtra()获得带有键“message”的扩展数据(如果确实扩展数据的内容是String),并且c )您没有向我们提供logCat列表。

我建议调试这些步骤:

  1. 调用Log.i以获取传入的Intent操作
  2. 调用Log.i获取“消息”键的传入Intent值。
  3. 发布结果。
  4. 发布代码,以便在发送广播意图
  5. 时准确显示“消息”的类型和值

    简而言之,您的BroadcastReceiver正在接收两个Intent,可能都是动作“com.ichat.message”。如果广播只在您的应用中的一个位置,那么该地点将达到两次。

答案 1 :(得分:0)

这是一个常见错误,您可能已将广播接收器放在manifest.xml中,其意图定义如下:

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

并在您的示例中创建一个代码。这实际上创建了两个intent过滤器,因此您可以删除xml中的intent过滤器,并且您应该只看到一个广播。