Подтвердить что ты не робот

Как создать другой pendingintent, поэтому filterEquals() возвращает false?

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

Резюме

Есть два ожидающих намерения. Один работает на 1000, а другой работает в 2000 каждый день. Каждый из них содержит идентификатор строки из базы данных для целей идентификации. Код выглядит примерно так:

Intent i = new Intent(mContext, ScheduleReceiver.class);
i.putExtra(RuleDBAdapter.KEY_ROWID, (int)taskId);
PendingIntent pi =PendingIntent.getBroadcast(...);
mAlarmManager.set(AlarmManager.RTC_WAKEUP, when.getTimeInMillis(), pi); 

Удаление:

Проблема заключается в том, когда нам нужно удалить один из них. Правильный способ удаления ожидающего намерения - установить идентичный, а затем вызвать отменить из AlarmManager.

Документация для Android:

public void cancel (операция PendingIntent)
Удалите все аварийные сигналы с соответствующим намерением. Любой аварийный сигнал любого типа, чье намерение соответствует этому (как определено filterEquals (Intent)), будет отменено.

public boolean filterEquals (Intent other)
Определите, совпадают ли два намерения для целей разрешения (фильтрации) намерений. То есть, если их действие, данные, тип, класс и категории одинаковы. Этот не сравнивает лишние данные, включенные в намерения.

Итак, в приведенном выше примере, если я делаю идентичный намерение, то отменю, оба из указанных намерений будут отменены, потому что они принадлежат к одному классу/тому же действию и т.д. (кроме "extra" данные rowId, но filterEquals не заботятся о дополнительных данных).

Есть ли какое-либо обходное решение для этого?

4b9b3361

Ответ 1

Вы можете попробовать использовать параметр requestCode при создании своего ожидающего намерения:

PendingIntent pi =PendingIntent.getBroadcast(mContext, yourUniqueDatabaseId,i,PendingIntent.FLAG_ONE_SHOT);

Это должно создать намерение, которое уникально для целей сопоставления.

Ответ 2

public boolean filterEquals (Intent other) сравнивает действие, данные, тип, пакет, компонент и категории, но не сравнивает лишние, поэтому разница между дополнительными функциями не может отличить Intents. Попытайтесь установить разные данные для этих намерений, данные могут быть незначительными Урисом.

Попробуйте прочитать исходный код, чтобы получить дополнительную информацию.

Ответ 3

Попытка положить фиктивное действие в намерении. Например.

myIntent.setAction(""+System.currentTimeMillis());

Это приведет к тому, что filterEquals вернет false.

Мне понадобилось подобное решение для отправки смс-уведомлений с нескольких номеров, чтобы позволить уведомлению запускать просмотрщик сообщений sms с разными номерами.

Ответ 4

Поместите идентификатор задачи и временную метку в действие намерения. Таким образом, вы связываете ожидающее намерение с идентификатором задачи, и намерения будут по-прежнему отличаться с точки зрения фильтрации.

intent.setAction("ACTION_" + taskId + "_" + currentTimestamp);

Ответ 5

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

После того, как вы начнете заполнять атрибут data, вы должны не забудьте добавить параметр данных в фильтр намерений в манифесте android. Если вы этого не сделаете, не будет запускать ваш пользовательский ресивер.

Примеры:

Цель

    Intent intent = new Intent(reminderFire);
intent.addCategory(reminderCategory);
Uri.Builder builder = new Uri.Builder();
builder.scheme(context.getString(R.string.scheme));
builder.authority(context.getString(R.string.intent_filter_reminder_host));
builder.appendQueryParameter("oid", Reminder.getOid());
intent.setData(builder.build());

Вкладка AndroidManifest

<receiver 
    android:name=".client.MyReminder"
    android:enabled="true"
>
    <intent-filter>
        <action android:name="com.example.client.reminder.fire"/>
        <action android:name="com.example.client.reminder.category"/>
        <data
            android:host="@string/intent_filter_reminder_host"
            android:scheme="@string/scheme" />
    </intent-filter>
</receiver>

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