Multiple calls to AlarmManager.setRepeating deliver the same Intent/PendingIntent extra values, but I supplied different ones
alarms, android, android-pendingintent, extras
Solution
The documentation for `PendingIntent.getBroadcast()` says:
Returns
Returns an existing or new PendingIntent matching the given parameters.
The problem is that two Intents differing only in extras seem to match for this purpose. So `getBroadcast()` will return some random old PendingIntent (with a different `EXTRA_ID`) instead of a new one around the Intent I just created. The fix is to supply a data Uri and make it differ with the id, like this:
Intent i = new Intent(MyReceiver.ACTION_ALARM, Uri.parse("timer:"+id));
You can then retrieve the id number using:
Long.parseLong(intent.getData().getSchemeSpecificPart());
...or of course supply the extra as well and use that.
Problem
Solved while writing this question, but posting in case it helps anyone: I'm setting multiple alarms like this, with different values of `id`: ``` AlarmManager alarms = (AlarmManager)context.getSystemService( Context.ALARM_SERVICE); Intent i = new Intent(MyReceiver.ACTION_ALARM); // "com.example.ALARM" i.putExtra(MyReceiver.EXTRA_ID, id); // "com.example.ID", 2 PendingIntent p = PendingIntent.getBroadcast(context, 0, i, 0); alarms.setRepeating(AlarmManager.RTC_WAKEUP, nextMillis, 300000, p); // 5 mins ``` ...and receiving them like this: ``` public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(ACTION_ALARM)) { // It's time to sound/show an alarm final long id = intent.getLongExtra(EXTRA_ID, -1); ``` The alarm is delivered to my receiver at the right times, but often with `EXTRA_ID` set to the wrong value: it's a value that I have used at some point, just not the one that I wanted delivered at that particular time.