我收到一些带有C2DM的json消息,到目前为止这很好。从C2DM有效负载中提取json消息后,我创建一个通知,用户单击后将打开一个活动,显示收到的消息。
第一次收到C2DM消息时(例如,“测试号1”消息),创建通知并在用户单击它时成功启动活动,我可以看到消息“测试号1”。然后我发送第二条C2DM消息,文本“测试号2”,通知已创建但是当我点击通知时,活动开始我看到“测试号1”消息,而不是第二条消息。
我正在创建这样的通知:
public static void createMessageNotification(Context context, Message msg) {
int icon = R.drawable.ic_stat_notify_msg; // icon from resources
CharSequence tickerText = "You've got a new message"; // ticker-text
long when = System.currentTimeMillis(); // notification time
CharSequence contentTitle = "Service Message"; // message title
CharSequence contentText = "New message";
Intent notificationIntent = new Intent(Intent.ACTION_MAIN);
notificationIntent.setClass(context, MessageDetailsActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
Bundle b = new Bundle();
b.putSerializable("message", msg);
notificationIntent.putExtras(b);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
Notification notification = new Notification(icon, tickerText, when);
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
long[] vibrate = {0,100,200,300};
notification.vibrate = vibrate;
notification.flags = Notification.FLAG_AUTO_CANCEL;
NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(AppUtil.getNextPushIndexMessage(), notification);
}
MessageDetailsActivity.java可以在这里找到:http://pastebin.com/tmBK7rNH
我在日志中看到消息来自C2DM服务正确,带有新数据和值,但我无法使MessageDetailsActivity显示新信息。
谢谢 Ť
答案 0 :(得分:2)
第二次调用PendingIntent.getActivity()
可能会在您第一次调用它时返回相同的PendingIntent
。
这可能有些令人困惑。 Android会保留PendingIntents
的缓存,当您致电getActivity()
或getBroadcast()
或getService()
时,会尝试查找与您提供的参数相匹配的缓存PendingIntent
给你。在您致电Intent
时,您已getActivity()
与Intent
匹配,而您在第一次提供的Intent
与您提供的Extras
之间的唯一区别它第二次出现在getActivity()
。不幸的是,当您致电Extras
时,它会在尝试在其缓存中找到匹配的PendingIntent
时忽略PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
notificationIntent, FLAG_UPDATE_CURRENT);
,因此它会返回您创建的第一个。{/ p>
要解决此问题,请将您的调用更改为getActivity()以包含FLAG_UPDATE_CURRENT标志,如下所示:
{{1}}
这将替换缓存的PendingIntent的数据以包含新的Extras。