Получены неверные статистические данные со всеми намерениями, кроме первого - PullRequest
12 голосов
/ 04 октября 2009

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

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

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

Это код, который регистрирует тревогу и передает намерение (основной класс пользовательского интерфейса):

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>

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

Ответы [ 3 ]

25 голосов
/ 04 октября 2009

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

9 голосов
/ 10 августа 2011

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

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

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

3 голосов
/ 18 мая 2015

лучшая ссылка, которую я нашел по этой теме: 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)
...