Несколько вызовов на ALATHMANAGER.SETREPEATING обеспечивают одинаковые дополнительные значения / определенные дополнительные значения, но я поставлял разные

StackOverflow https://stackoverflow.com/questions/2844274

Вопрос

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

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

Это было полезно?

Решение

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

Возвращается

Возвращает существующую или новую запись подходящего в соответствии с заданными параметрами.

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

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

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

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

... или, конечно, снабжать дополнительным и использовать это.

Другие советы

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

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

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

Решение для вашей проблемы использует Incent.flag_activity_new_task

  p = PendingIntent.getBroadcast(context, 0, i, Intent.FLAG_ACTIVITY_NEW_TASK);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top