我正在尝试使用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);
任何人都可以帮助我吗?
答案 0 :(得分:0)
您确实没有提供任何证据证明在两种情况下Intent都包含相同的扩展数据。我之所以这样说是因为a)你从不记录传入的动作,b)你没有通过调用getStringExtra()获得带有键“message”的扩展数据(如果确实扩展数据的内容是String),并且c )您没有向我们提供logCat列表。
我建议调试这些步骤:
简而言之,您的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过滤器,并且您应该只看到一个广播。