scheduled - crear un despertador en android
MĂșltiples llamadas a AlarmManager.setRepeating entregan los mismos valores adicionales de Intent/PendingIntent, pero suministrĂ© diferentes (3)
La documentación para PendingIntent.getBroadcast()
dice:
Devoluciones
Devuelve un PendingIntent existente o nuevo que coincide con los parámetros dados.
El problema es que dos Intents que difieren solo en extras parecen coincidir para este propósito. Entonces, getBroadcast()
devolverá un PendingIntent antiguo aleatorio (con un EXTRA_ID
diferente) en lugar de uno nuevo alrededor del Intent que acabo de crear. La solución es proporcionar un Uri de datos y hacer que difiera con el ID, como esto:
Intent i = new Intent(MyReceiver.ACTION_ALARM, Uri.parse("timer:"+id));
A continuación, puede recuperar el número de identificación utilizando:
Long.parseLong(intent.getData().getSchemeSpecificPart());
... o por supuesto provea el extra y use eso.
Resuelto al escribir esta pregunta, pero publicar en caso de que ayude a alguien:
Estoy configurando múltiples alarmas como esta, 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 recibiéndolos así:
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 envía a mi receptor en el momento adecuado, pero a menudo con EXTRA_ID
configurado en el valor incorrecto: es un valor que he usado en algún momento, pero no el que quería que se entregara en ese momento en particular.
La solución para su problema es usar Intent.FLAG_ACTIVITY_NEW_TASK
p = PendingIntent.getBroadcast(context, 0, i, Intent.FLAG_ACTIVITY_NEW_TASK);
También puede utilizar el indicador PendingIntent.FLAG_UPDATE_CURRENT
PendingIntent p = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
esto debería funcionar también