2010-05-16 8 views
17

resueltos al escribir esta pregunta, pero publicar en caso de que ayuda a nadie:múltiples llamadas a AlarmManager.setRepeating entregan los mismos valores adicionales PendingIntent Intención /, pero suministran diferentes los

Soy la creación de múltiples alarmas de este tipo, con diferentes valores de id:

AlarmManager alarms = (AlarmManager)context.getSystemService(
     Context.ALARM_SERVICE); 
Intent i = new Intent(MyReceiver.ACTION_ALARM); // "com.example.ALARM" 
i.putExtra(MyReceiver.EXTRA_ID, id); // "com.example.ID", 2 
PendingIntent p = PendingIntent.getBroadcast(context, 0, i, 0); 
alarms.setRepeating(AlarmManager.RTC_WAKEUP, nextMillis, 300000, p); // 5 mins 

... y que reciben como esto:

public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(ACTION_ALARM)) { 
     // It's time to sound/show an alarm 
     final long id = intent.getLongExtra(EXTRA_ID, -1); 

La alarma se entrega a mi receptor de una t los tiempos correctos, pero a menudo con EXTRA_ID establecido en el valor incorrecto: es un valor que he usado en algún momento, pero no el que quería entregar en ese momento en particular.

Respuesta

24

La documentación para PendingIntent.getBroadcast() dice:

devoluciones

Devuelve una nueva PendingIntent coincidentes o existentes de los parámetros dados.

El problema es que dos Intents que difieren solo en los extras parecen coincidir para este propósito. Entonces, getBroadcast() devolverá algún PendingIntent viejo y aleatorio (con un EXTRA_ID diferente) en lugar de uno nuevo alrededor de la intención que acabo de crear. La solución es suministrar una URI de datos y hacer que se diferencia con el id, así:

Intent i = new Intent(MyReceiver.ACTION_ALARM, Uri.parse("timer:"+id)); 

A continuación, puede recuperar el número de identificación usando:

Long.parseLong(intent.getData().getSchemeSpecificPart()); 

... o, por supuesto, el suministro extra también y usar eso.

+0

Sólo me preguntaba, si una nueva intento con Intención i = nueva intención (contexto, Cls); ¿Tengo este problema de identificación mixta? En mi caso, el Cls es diferente para diferentes Alarmas. Debería estar bien, ¿verdad? – Safecoder

+0

Actualmente no puedo encontrar el lugar exacto que miré antes para ver el punto acerca de los extras, pero sí, con una clase diferente es una Intento completamente diferente, así que mucho esperaría que funcione. –

+1

@ChrisBoyle, muchas gracias. Pero en mi caso, no funciona. Sin embargo, esto funciona: 'intención intención = nueva intención (nulo, Uri.parse (Long.toString (id)), contexto, AlarmActivity.class);'. Tenga en cuenta que puedo usar actividad. –

7

También es posible usar la bandera PendingIntent.FLAG_UPDATE_CURRENT

PendingIntent p = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT); 

este caso de que el trabajo también

+0

Si solo iba a usarlo de a una por vez, entonces sí, pero para una alarma con múltiples temporizadores configurados, necesita múltiples PendingIntents para ser válidos al mismo tiempo, y FLAG_UPDATE_CURRENT lo dejaría con todas las alarmas enviando la intención más reciente. –

2

La solución para su problema es utilizar Intent.FLAG_ACTIVITY_NEW_TASK

p = PendingIntent.getBroadcast(context, 0, i, Intent.FLAG_ACTIVITY_NEW_TASK); 
Cuestiones relacionadas