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

谁能帮我?

4

2 回答 2

0

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

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

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

于 2013-09-09T16:18:18.843 回答
0

您确实没有提供任何证据证明在这两种情况下 Intent 都包含相同的扩展数据。我这样说是因为 a) 您从不记录传入的操作,b) 您没有通过调用 getStringExtra() 获取带有键“消息”的扩展数据(如果该扩展数据的内容确实是一个字符串),并且 c ) 您没有向我们提供 logCat 列表。

我建议使用以下步骤进行调试:

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

简而言之,您的 BroadcastReceiver 正在接收两个 Intent,大概都带有“com.ichat.message”操作。如果广播仅在您的应用程序中的一个位置,则该位置被到达两次。

于 2012-11-21T23:10:15.413 回答