2009-10-04 13 views
9

tengo una pequeña aplicación que puede ser utilizada para establecer recordatorios para eventos futuros. La aplicación utiliza un AlarmManager para establecer el momento en que se debe recordar al usuario. Cuando la alarma se apaga, un BroadcastReceiver registra esto y, a su vez, inicia un servicio para notificar al usuario mediante un brindis y una notificación en la barra de estado.extras incorrecta recibida con todos los intentos pero el primero

Con el fin de mostrar la información correcta en la notificación y tostadas, alguna información extra se pasa junto con el intento. La primera vez que se registra un recordatorio, la información recibida por BroadcastReceiver y transferida al servicio es correcta. Pero para cada recordatorio siguiente (es decir, cada nuevo intento recibido por BroadcastReceiver) esta información permanece igual incluso cuando la información enviada es diferente.

A modo de ejemplo, si la cadena "foo" se pone como un extra con el primer intento, "foo" se extrae correctamente por el BroadcastReceiver. Si "bar" se coloca como un extra en el segundo intento, "Broadcast Receiver" sigue extrayendo "foo".

Este es el código que se registra la alarma y pasa la intención (principal de clase 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); 

El OnReceive() - método en la clase 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); 
} 

La intención -filtro en el manifiesto:

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

He estado atascado con esto desde hace un tiempo, así que ayuda es muy ¡muy apreciado!

Respuesta

8

Las respuestas anteriores son correctas, pero carecen de una explicación. Vale la pena señalar esta parte de la PendingIntent documentation:

Un sí PendingIntent es simplemente una referencia a una muestra mantenida por el sistema que describe los datos originales utilizados para recuperarlo. ... Si la aplicación creadora vuelve a recuperar el mismo tipo de PendingIntent (misma operación, misma acción de Intención, datos, categorías y componentes, y las mismas banderas), recibirá un PendingIntent que representa el mismo token

Tenga en cuenta que los datos "extra" es específicamente no incluido en el concepto de identidad PendingIntent!

Cuestiones relacionadas