2009-10-04 4 views
9

У меня есть небольшое приложение, которое можно использовать для установки напоминаний о будущих событиях. Приложение использует 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> 

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

ответ

8

Вышеуказанные ответы верны, но им не хватает объяснений. Стоит отметить эту часть PendingIntent documentation:

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

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