Pregunta

Tengo una pequeña aplicación que puede ser utilizada para establecer recordatorios para eventos futuros. La aplicación utiliza una AlarmManager para ajustar el tiempo para cuando el usuario debe recordar. Cuando se activa la alarma, un BroadcastReceiver registra esto y, a su vez inicia un servicio para notificar al usuario a través de un pan tostado y una notificación en la barra de estado.

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 ha registrado un recordatorio, la información recibida por el BroadcastReceiver y se transmite al servicio es correcto. Pero para cada recordatorio siguiente (es decir, cada nuevo intento recibida por el BroadcastReceiver) esta información se mantiene 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 "barra" se pone como extra en el segundo intento, "foo" está siendo extraído por el BroadcastReceiver.

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 atrapado con esto durante algún tiempo, por lo que ayuda es muy apreciada!

¿Fue útil?

Solución

Trate de añadir FLAG_UPDATE_CURRENT a su PendingIntent cuando se crea a través de getBroadcast().

Otros consejos

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

  

A PendingIntent en sí es simplemente una referencia a un contador mantenido por el sistema que describe los datos originales utilizados para recuperarlo. ... Si la aplicación de creación de nuevo más tarde recupera el mismo tipo de PendingIntent (misma operación, misma acción Intención, los datos, las categorías y los componentes, y las mismas banderas), recibirá un PendingIntent en representación de la misma manera

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

Enlace mejor que he encontrado sobre este tema: http://alvinalexander.com/source-code/android/android-how-attach-extra-intent-pendingintent-notification-solution-example

esta es la pista:

int uniqueInt = (int) (System.currentTimeMillis() & 0xfffffff);
PendingIntent.getService(context, uniqueInt, intent, 0)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top