Notification启动的活动不会更新

时间:2012-05-26 14:10:57

标签: android android-intent android-c2dm

我收到一些带有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显示新信息。

谢谢 Ť

1 个答案:

答案 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。