Varias llamadas a AlarmManager.setRepeating entregan los mismos valores adicionales Intención / PendingIntent, pero me suministran los diferentes

StackOverflow https://stackoverflow.com/questions/2844274

Pregunta

Resuelto al escribir esta pregunta, pero publicar en caso de que ayuda a nadie:

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 la recepción de ellos de esta manera:

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 en el momento adecuado, pero a menudo con juego EXTRA_ID a un valor incorrecto: es un valor que he utilizado en algún momento, pero no el que yo quería entregado en ese momento <. / p>

¿Fue útil?

Solución

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

  

Devuelve

     

Devuelve un PendingIntent existente o nuevo juego de los parámetros dados.

El problema es que dos Intentos que sólo difieren en extras parecen coincidir con este fin. Así getBroadcast() volverá alguna PendingIntent de edad al azar (con un EXTRA_ID diferente) en lugar de uno nuevo en torno a la I Intención acaba de crear. La solución es suministrar un URI de datos y hacer que difieren con el id, como este:

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, suministrar el extra, así y usar eso.

Otros consejos

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

La solución para su problema es el uso Intent.FLAG_ACTIVITY_NEW_TASK

  p = PendingIntent.getBroadcast(context, 0, i, Intent.FLAG_ACTIVITY_NEW_TASK);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top