0

C2DM でいくつかの json メッセージを受信して​​いますが、これまでのところ問題ありません。C2DM ペイロードから json メッセージを抽出したら、ユーザーがクリックすると、受信したメッセージを表示するアクティビティを開くという通知を作成します。

C2DM メッセージ (「テスト番号 1」メッセージなど) を初めて受信すると、通知が作成され、ユーザーがクリックするとアクティビティが正常に開始され、「テスト番号 1」というメッセージが表示されます。次に、「テスト番号 2」というテキストを含む 2 番目の 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 を作成して新しい情報を表示することはできません。

ありがとうございます

4

1 に答える 1

2

2 回目の呼び出しPendingIntent.getActivity()は、おそらくPendingIntent最初に呼び出したときと同じものを返します。

これはやや混乱する可能性があります。Android は、PendingIntents呼び出し時にキャッシュを保持するgetActivity()getBroadcast()、指定したパラメーターに一致getService()するキャッシュを見つけようPendingIntentとして返されます。Intentへの呼び出しで to match を指定しましたが、最初に指定した と2 回目に指定getActivity()した の唯一の違いはです。残念ながら、呼び出すと、キャッシュ内で一致するものを見つけようとするときに が無視されるため、最初に作成したものが返されます。IntentIntentExtrasgetActivity()ExtrasPendingIntent

これを回避するには、 getActivity() への呼び出しを変更して、次のように FLAG_UPDATE_CURRENT フラグを含めます。

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, 
                      notificationIntent, FLAG_UPDATE_CURRENT);

これにより、キャッシュされた PendingIntent のデータが新しい Extras を含むように置き換えられます。

于 2012-05-29T17:01:22.630 に答える