Varias llamadas a AlarmManager.setRepeating entregan los mismos valores adicionales Intención / PendingIntent, pero me suministran los diferentes
-
27-09-2019 - |
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>
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);