Jefferson Setiawan
Jefferson Setiawan

Reputation: 536

Android: Call IntentService from NotificationManager action PendingIntent

I have a push notification app. When the push notification comes, the BroadcastReceiver calls GCMIntentService to setup notification

mNotificationManager = (NotificationManager) this
                .getSystemService(Context.NOTIFICATION_SERVICE);
        Intent intent = new Intent(this, HomeActivity.class);
        Intent intent = new Intent(this, AddToCalendarIntentService.class);
        intent.putExtra(JSON_KEY_CLASS_ID, classid);
        intent.putExtra(JSON_KEY_CLASS_NAME, classname);
        intent.putExtra(Config.JSON_KEY_DATE, tgl);
        intent.putExtra(Config.JSON_KEY_TIME_START, timestart);
        intent.putExtra(Config.JSON_KEY_TIME_END, timeend);
        intent.putExtra(Config.JSON_KEY_VENUE, venue);
        Log.d(LOG_TAG, classid + ", " + classname + ", " + venue);
        PendingIntent contentIntent = PendingIntent.getService(this, 0,
                intent, 0);

        NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(this)
                        .setSmallIcon(R.drawable.ic_notif)
                        .setContentTitle("Re: " + classname)
                        .setStyle(new NotificationCompat.BigTextStyle()
                                .bigText(pesan))
                        .setContentText(pesan)
                        .setDefaults(NotificationCompat.DEFAULT_VIBRATE)
                        .setDefaults(NotificationCompat.DEFAULT_LIGHTS)
                        .setDefaults(NotificationCompat.DEFAULT_SOUND)
                        .addAction(R.drawable.ic_action_add_person, "Add to Calendar", contentIntent)
                        .setAutoCancel(true)
                        .setTicker("Reschedule Class");

        mBuilder.setContentIntent(contentIntent);
        mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());

When user click on the Add to Calendar, it invoke PendingIntent to start AddToCalendarIntentService with all the parameter.

public class AddToCalendarIntentService extends IntentService {

public AddToCalendarIntentService() {
    super("AddToCalendarIntentService");
}

@Override
protected void onHandleIntent(Intent intent) {
    final String JSON_KEY_CLASS_NAME = "classname";
    final String JSON_KEY_CLASS_ID = "classid";
    Bundle extra = intent.getExtras();
    String title = extra.getString(JSON_KEY_CLASS_NAME);
    String location = extra.getString(Config.JSON_KEY_VENUE);
    String tgl = extra.getString(Config.JSON_KEY_DATE);
    String[] tglSplit = tgl.split("-");
    int year = Integer.parseInt(tglSplit[0]);
    int month = Integer.parseInt(tglSplit[1]);
    int date = Integer.parseInt(tglSplit[2]);

    String timestart = extra.getString(Config.JSON_KEY_TIME_START);
    String timeend = extra.getString(Config.JSON_KEY_TIME_END);
    String[] start = timestart.split(":");
    String[] end = timeend.split(":");
    int hourStart = Integer.parseInt(start[0]);
    int minStart = Integer.parseInt(start[1]);
    int hourEnd = Integer.parseInt(end[0]);
    int minEnd = Integer.parseInt(end[1]);
    Log.d("INTENT SERVICE", location);
    TaskHelper.addToCalendar(this, "Reschedule: " + title, location, year, month-1, date, hourStart, minStart, hourEnd, minEnd);
    NotificationManager mNotification = (NotificationManager) this
            .getSystemService(Context.NOTIFICATION_SERVICE);
    mNotification.cancel(1);
}
}

The code works, but if I got the other notification again, and Added it to calendar, the parameter in AddToCalendarIntentService keep the old parameter, ignoring the new one. For example, in the first the location is Indonesia, both GCMIntentService and AddToCalendarIntentService log show Indonesia.

In the 2nd notification, the location is Singapore, it show correctly in GCMIntentService, but when logging in AddToCalendarIntentService, it show Indonesia (It should be Singapore).

Please help.

Thank you.

Upvotes: 4

Views: 3088

Answers (2)

Martial Konvi
Martial Konvi

Reputation: 31

As TomerZ pointed out, the system thinks its the same PendingIntent. Add the Flag: PendingIntent.FLAG_UPDATE_CURRENT to your pending intent to inform the system to update the extras of the pending intent.

PendingIntent contentIntent = PendingIntent.getService(this, 0,
            intent, PendingIntent.FLAG_UPDATE_CURRENT);

The documentation of the FLAG_UPDATE_CURRENT for reference

Upvotes: 1

TomerZ
TomerZ

Reputation: 635

It is because the system thinks its the same PendingIntent, if you want to have a couple of pending intents you need to differentiate them.

The easiest way is to supply different requestCodes (the 2nd parameters of PendingIntent.getService).

You can read more about it here:

http://developer.android.com/reference/android/app/PendingIntent.html

Upvotes: 3

Related Questions