Неверные дополнения получены со всеми намерениями, кроме первого

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

Вопрос

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

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

В качестве примера, если строка "foo" помещается как дополнительная с первым намерением, "foo" корректно извлекается BroadcastReceiver.Если "bar" помещен как дополнительный во втором намерении, "foo" все равно извлекается BroadcastReceiver.

Это код, который регистрирует сигнал тревоги и передает намерение (основной ui-класс).:

Intent intent = new Intent(ACTION_SET_ALARM);
intent.putExtra("desc", desc);
intent.putExtra("time", time);
intent.putExtra("dbId", dbId);
intent.putExtra("millis", millis);
PendingIntent pIntent = PendingIntent.getBroadcast(quickAlert.this, 0, intent, 0);

// Schedule the alarm!
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, millis, pIntent);

onReceive()-метод в классе BroadcastReceiver:

@Override
public void onReceive(Context context, Intent intent) {

    Intent i = new Intent(context, AlertService.class);

    String desc = intent.getStringExtra("desc").equals("") ? "": ": " + intent.getStringExtra("desc");
    String time = intent.getStringExtra("time");
    long dbId = intent.getLongExtra("dbId", -1);
    long millis = intent.getLongExtra("millis", -1);

    i.putExtra("desc", desc);
    i.putExtra("time", time);
    i.putExtra("dbId", dbId);
    i.putExtra("millis", millis);
    Log.d(TAG, "AlertReceiver: " + desc + ", " + time + ", " + dbId + ", " + millis);

    Toast.makeText(context, "Reminder: " + desc, Toast.LENGTH_LONG).show();
    context.startService(i);
}

Фильтр намерений в манифесте:

<receiver android:name=".AlertReceiver">
        <intent-filter>
            <action android:name="com.aspartame.quickAlert.ACTION_SET_ALARM" />
        </intent-filter>
    </receiver>

Я застрял с этим уже некоторое время, так что помощь очень ценится!

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

Решение

Попробуйте добавить FLAG_UPDATE_CURRENT к вашему PendingIntent когда вы создаете его с помощью getBroadcast().

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

Приведенные выше ответы верны, но в них нет объяснения.Стоит отметить эту часть Документация PendingIntent:

Сам PendingIntent - это просто ссылка на токен, поддерживаемый системой, описывающий исходные данные, используемые для его извлечения....Если создающее приложение позже повторно извлекает тот же тип PendingIntent (та же операция, то же действие намерения, данные, категории и компоненты и те же флаги), оно получит PendingIntent, представляющий тот же токен

Обратите внимание, что "дополнительные" данные - это специально нет включено в концепцию PendingIntent-идентичности!

лучшая ссылка, которую я нашел по этой теме: http://alvinalexander.com/source-code/android/android-how-attach-extra-intent-pendingintent-notification-solution-example

это и есть ключ к разгадке:

int uniqueInt = (int) (System.currentTimeMillis() & 0xfffffff);
PendingIntent.getService(context, uniqueInt, intent, 0)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top