Отмена определенного PendingIntents с AlarmManager - PullRequest
1 голос
/ 09 марта 2012

Я планирую отправить несколько намерений на BroadcastReceiver. Разница между каждым намерением - это время, когда оно будет получено, и содержащиеся в нем дополнительные данные.

Теперь мне нужно разрешить пользователю отменять определенные тревоги. Согласно javadoc AlarmManager.cancel (), он сравнивает намерения, используя метод filterEquals:

http://developer.android.com/reference/android/content/Intent.html#filterEquals(android.content.Intent)

Теперь проблема в том, что согласно filterEquals все мои намерения одинаковы. Метод проверяет «действие, данные, тип, класс и категории».

И уникальные данные либо в намеренном дополнительном пакете, либо как время в AlarmManager. Я попытался изменить любой из этих параметров - например, используя:

intent.setData(Uri.withAppendedPath(Uri.EMPTY, "some_unique_data"));

Это сделало бы каждое намерение уникальным в соответствии с методом filterEquals, но после изменения данных на что-то вроде этого мое намерение больше не достигает BroadcastReceiver.

Какой конкретный бит данных я могу изменить, чтобы каждое намерение было уникальным в соответствии с filterEquals и все еще могло быть получено моим простым BroadcastReceiver?

Может быть, я могу каким-либо образом изменить свой приемник?

Ответы [ 2 ]

3 голосов
/ 10 марта 2012

Хорошо, так что я понял это.Поскольку у каждого моего будильника есть уникальное время и идентификатор объекта, я создаю свой PendingIntent:

return PendingIntent.getBroadcast(context, time*100000+o.getId(), toFire, 0);

Теперь время составляет либо 24, либо 15 (за 24 часа до или за 15 минут до события, когда я активировал свой будильник)Объект данных тревоги содержит уникальный идентификатор.Поэтому я добавляю оба и указываю его как параметр «requestCode» в getBroadcast.Этого достаточно для создания уникальных намерений на основе одних и тех же данных.Надеюсь, это поможет любому, у кого такая же проблема!

1 голос
/ 09 марта 2012

Я столкнулся с подобной проблемой для моего приложения.В моем приложении я использовал базу данных SQLite для хранения сведений о каждом аварийном сигнале вместе с уникальным ROW_ID.

Так что в моем просмотре списка аварийных сигналов каждой строке был присвоен соответствующий ROW_ID.Если пользователь нажимает на определенную строку, я просто передаю этот ROW_ID методу, который выполняет операцию удаления

Теперь все мои аварийные сигналы были созданы с помощью Intents, чья часть данных была установлена ​​как:

Uri.parse(Constants.INTENT_PRE + ROW_ID);

поэтому, чтобы удалить их, я создаю Intent, который имеет те же данные (как и выше, вместе с уникальным ROW_ID), который использовался при его создании.

Само собой разумеется, из "action,Данные, тип, класс и категории ", только часть" данные "отличается для каждого из моих существующих PendingIntents.

Надеюсь, это поможет!

...