Несколько вызовов в 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 time to sound/show an alarm
final long id = intent.getLongExtra(EXTRA_ID, -1);
Тревога доставляется в мой приемник в нужное время, но часто с EXTRA_ID
устанавливается неправильное значение: это значение, которое я использовал в какой-то момент, а не тот, который я хотел доставить в это конкретное время.
Ответы
Ответ 1
В документации для PendingIntent.getBroadcast()
указано:
Возвращает
Возвращает существующий или новый PendingIntent, соответствующий заданным параметрам.
Проблема состоит в том, что для этой цели подходят два намерения, отличающиеся только дополнительными возможностями. Таким образом, getBroadcast()
вернет какой-то случайный старый PendingIntent (с другим EXTRA_ID
) вместо нового вокруг созданного мной Intent. Исправление состоит в том, чтобы предоставить данные Uri и сделать их разными с идентификатором, например:
Intent i = new Intent(MyReceiver.ACTION_ALARM, Uri.parse("timer:"+id));
Затем вы можете получить номер идентификатора, используя:
Long.parseLong(intent.getData().getSchemeSpecificPart());
... или, конечно же, дополнительно поставляйте и используйте это.
Ответ 2
Вы также можете использовать флаг PendingIntent.FLAG_UPDATE_CURRENT
PendingIntent p = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
это тоже должно работать.
Ответ 3
Решение вашей проблемы - использование Intent.FLAG_ACTIVITY_NEW_TASK
p = PendingIntent.getBroadcast(context, 0, i, Intent.FLAG_ACTIVITY_NEW_TASK);