web-dev-qa-db-ja.com

保留中のインテントを使用するputExtraが機能しない

多くのユーザーにプッシュ通知を送信するコードをGCMIntentserviceに記述しました。通知がクリックされたときにDescriptionActivityクラスを呼び出すNotificationManagerを使用します。また、event_idをGCMIntentServiceからDescriptionActivityに送信します

protected void onMessage(Context ctx, Intent intent) {
     message = intent.getStringExtra("message");
     String tempmsg=message;
     if(message.contains("You"))
     {
        String temparray[]=tempmsg.split("=");
        event_id=temparray[1];
     }
    nm= (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
    intent = new Intent(this, DescriptionActivity.class);
    Log.i("the event id in the service is",event_id+"");
    intent.putExtra("event_id", event_id);
    intent.putExtra("gcmevent",true);
    PendingIntent pi = PendingIntent.getActivity(this,0, intent, 0);
    String title="Event Notifier";
    Notification n = new Notification(R.drawable.defaultimage,message,System.currentTimeMillis());
    n.setLatestEventInfo(this, title, message, pi);
    n.defaults= Notification.DEFAULT_ALL;
    nm.notify(uniqueID,n);
    sendGCMIntent(ctx, message);

}

ここで、上記のメソッドで取得しているevent_idは正しいです。つまり、常に更新されたものを取得します。しかし、以下のコード(DescriptionActivity.Java)では:

    intent = getIntent();
    final Bundle b = intent.getExtras();
    event_id = Integer.parseInt(b.getString("event_id"));

ここでのevent_idは常に「5」です。 GCMIntentServiceクラスにExtraを何に入れても、取得するevent_idは常に5です。誰かが問題を指摘できますか?保留中の意図によるものですか?はいの場合、どのように処理すればよいですか?

22
Nemin

PendingIntentは、最初に指定したIntentで再利用されます。これが、問題です。

これを回避するには、PendingIntent.getActivity()を呼び出して実際に新しいフラグを取得するときに、フラグ PendingIntent.FLAG_CANCEL_CURRENT を使用します。

PendingIntent pi = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

または、エクストラを更新するだけの場合は、フラグ PendingIntent.FLAG_UPDATE_CURRENT を使用します。

42
Joffrey

ジョフリーが言ったように、PendingIntentは最初に提供したインテントで再利用されます。フラグPendingIntent.FLAG_UPDATE_CURRENTを使用してみてください。

PendingIntent pi = PendingIntent.getActivity(this,0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
12
santhyago

たぶん、あなたはまだ古い意図を使用しています。これを試して:

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    //try using this intent

    handleIntentExtraFromNotification(intent);
}
4
Filip Marusca