Несколько вызовов AlarmManager.setRepeating доставляют одни и те же дополнительные значения Intent / PendingIntent, но я предоставлял разные - PullRequest
17 голосов
/ 16 мая 2010

Решается при написании этого вопроса, но публикует на тот случай, если это кому-нибудь поможет:

Я устанавливаю несколько сигналов тревоги, как это, с различными значениями 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

... и получаю их так:

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);

Тревога доставляется моему приемнику в нужное время, но часто с EXTRA_ID, установленным на неправильное значение: это значение, которое я использовал в какой-то момент, но не то, которое я хотел доставить в это конкретное время .

Ответы [ 3 ]

24 голосов
/ 16 мая 2010

Документация для PendingIntent.getBroadcast() гласит:

Возвращает

Возвращает существующий или новый PendingIntent, соответствующий заданным параметрам.

Проблема в том, что два Intents, отличающиеся только дополнениями, похоже, подходят для этой цели. Таким образом, getBroadcast() вернет какой-то случайный старый PendingIntent (с другим EXTRA_ID) вместо нового, только что созданного мной. Исправление заключается в том, чтобы предоставить данные Uri и отличать их от идентификатора, например:

Intent i = new Intent(MyReceiver.ACTION_ALARM, Uri.parse("timer:"+id));

Затем вы можете получить идентификационный номер, используя:

Long.parseLong(intent.getData().getSchemeSpecificPart());

... или, конечно, также поставьте дополнительное и используйте его.

7 голосов
/ 05 января 2011

Вы также можете использовать флаг PendingIntent.FLAG_UPDATE_CURRENT

PendingIntent p = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);

это должно работать тоже

2 голосов
/ 13 января 2012

Решением вашей проблемы является использование Intent.FLAG_ACTIVITY_NEW_TASK

  p = PendingIntent.getBroadcast(context, 0, i, Intent.FLAG_ACTIVITY_NEW_TASK);
...