Множественные вызовы AlarmManager.setRepeating поставляют те же дополнительные значения Intent/PendingIntent, но я предоставил различные

Решенный при записи этого вопроса, но регистрации в случае, если это помогает любому:

Я поставил несколько будильников как это с различными значениями 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 набор к неправильному значению: это - значение, которое я использовал в какой-то момент, просто не тот, который я хотел поставленный в то определенное время.

17
задан Chris Boyle 16 May 2010 в 15:22
поделиться

1 ответ

В документации к PendingIntent.getBroadcast() сказано:

Returns

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

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

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

Затем вы можете получить номер id, используя:

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

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

24
ответ дан 30 November 2019 в 12:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: