¿Es posible crear múltiples PendingIntents con el mismo requestCode y diferentes extras?
Estoy usando AlarmManager
para programar en cualquier lugar entre 1 y 35 alarmas (dependiendo de la entrada del usuario). Cuando el usuario solicita programar nuevas alarmas, necesito cancelar las alarmas actuales, así que creo todas mis alarmas con el mismo requestCode, definido en una variable final
.
// clear remaining alarms Intent intentstop = new Intent(this, NDService.class); PendingIntent senderstop = PendingIntent.getService(this, NODIR_REQUESTCODE, intentstop, 0); am.cancel(senderstop); // loop through days if (sched_slider.getBooleanValue()) for (int day = 1; day < 8; day++) { if (day == 1 && sun.isChecked()) scheduleDay(day); if (day == 2 && mon.isChecked()) scheduleDay(day); if (day == 3 && tue.isChecked()) scheduleDay(day); if (day == 4 && wed.isChecked()) scheduleDay(day); if (day == 5 && thu.isChecked()) scheduleDay(day); if (day == 6 && fri.isChecked()) scheduleDay(day); if (day == 7 && sat.isChecked()) scheduleDay(day); } ... public void scheduleDay(int dayofweek) { Intent toolintent = new Intent(this, NDService.class); toolintent.putExtra("TOOL", "this value changes occasionally"); PendingIntent pi = PendingIntent.getService(this, NODIR_REQUESTCODE, toolintent, 0); calendar.set(Calendar.DAY_OF_WEEK, dayofweek); calendar.set(Calendar.HOUR_OF_DAY, hour); calendar.set(Calendar.MINUTE, minute); calendar.set(Calendar.SECOND, 0); am.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, pi); }
Aquí, si el usuario tiene sun
(que es un CheckBox) marcado, programará una alarma para que se ejecute cada domingo a la hour
y minute
. Puede ver que cada alarma creada de esta manera tiene el mismo requestCode, pero la TOOL
extra cambia a veces para cada alarma.
- Eliminar alarma de AlarmManager mediante cancel () - Android
- ¿Cómo actualizar vista de un widget en el botón de clic en android?
- No se puede enviar la intención pendiente del widget, SendIntentException
- Creación de una notificación en un momento determinado mediante el Administrador de alarmas
- Android: ¿cómo abrir una notificación de envío directo que, cuando se cierre, vuelve a la pantalla de inicio?
Sin embargo, en mis pruebas, cuando la alarma se apaga y mi servicio se ejecuta, los extras de la intención ahora son null
. Esta pregunta sugiere que el uso de PendingIntent.FLAG_CANCEL_CURRENT
resolverá esto, pero no cancelaría los otros PendingIntents?
En breve:
¿Puede alguien explicar cómo funciona PendingIntents, en referencia a la creación de varios con el mismo requestCode y diferentes extras? ¿Qué banderas (si las hay) debería usar?
- Pasando intención extra a receptor de radiodifusión android
- Eliminar los datos de la intención de notificación
- Cómo detener AlarmManager
- Servicio para la pantalla de bloqueo antes de abrir la aplicación
- Ocultar la acción del teléfono abierta en el uso
- Interacción con AsyncTask de la barra de notificación
- ¿Puede un receptor de difusión captar múltiples transmisiones?
- Android: PendingIntent de la notificación no activa el onCreate () si se vuelve a activar la actividad en la pantalla
En realidad, no "crea" PendingIntent
. Las solicita desde el marco de Android. Cuando solicita un PendingIntent
desde el framework Android, comprueba si ya existe un PendingIntent
que coincida con los criterios que pasa como argumentos. Si es así, no crea una nueva PendingIntent
, solo le devuelve un "token" que apunta a la PendingIntent
existente. Si no encuentra una PendingIntent
coincidente, creará una y luego le devolverá un "token" que apunte a la que acaba de crear. Hay algunos indicadores que puede configurar para modificar este comportamiento, pero no mucho. Lo más importante a entender aquí es la forma en que el marco de Android hace la coincidencia.
Para ello, comprueba si coinciden los siguientes parámetros (comparando el PendingIntent
existente con los parámetros que ha pasado):
- Los códigos de solicitud deben ser los mismos. De lo contrario no coinciden.
- La "acción" en la
Intent
debe ser la misma (o ambas nulas). De lo contrario no coinciden. - Los "datos" en el
Intent
deben ser los mismos (o ambos nulos). De lo contrario no coinciden. - El "tipo" (de los datos) en el
Intent
debe ser el mismo (o ambos nulos). De lo contrario no coinciden. - El "paquete" y / o "componente" en el
Intent
debe ser el mismo (o ambos nulos). De lo contrario no coinciden. Los campos "paquete" y "componente" se establecen para "explícito"Intent
s. - La lista de "categorías" en la
Intent
debe ser la misma. De lo contrario no coinciden.
Usted debe notar que "extras" no está en la lista de arriba . Esto significa que si solicita un PendingIntent
los "extras" no se tienen en cuenta cuando el framework de Android intenta encontrar un PendingIntent
coincidente. Este es un error común que los desarrolladores hacen.
Ahora podemos tratar los indicadores adicionales que puede agregar para modificar el comportamiento de una solicitud de PendingIntent
:
FLAG_CANCEL_CURRENT
– Cuando se especifica este indicador, si se encuentra un PendingIntent
coincidente, PendingIntent
se cancela (se elimina, se elimina, se invalida) y se crea uno nuevo. Esto significa que cualquier aplicación que PendingIntent
un "token" que apunte a la antigua PendingIntent
no podrá usarla, ya que ya no es válida.
FLAG_NO_CREATE
– Cuando se especifica este indicador, si se encuentra un PendingIntent
coincidente, se PendingIntent
un "token" que apunta al PendingIntent
existente (este es el comportamiento habitual). Sin embargo, si no se encuentra PendingIntent
coincidente, no se crea una nueva y la llamada sólo devuelve null
. Esto se puede usar para determinar si hay un PendingIntent
activo para un conjunto específico de parámetros.
FLAG_ONE_SHOT
– Cuando se especifica este indicador, el PendingIntent
que se crea sólo se puede utilizar una vez. Esto significa que si da el "token" para este PendingIntent
a varias aplicaciones, después del primer uso de PendingIntent
será cancelado (eliminado, eliminado, invalidado) para que cualquier intento futuro de usarlo fallará.
FLAG_UPDATE_CURRENT
– Cuando se especifica este indicador, si se encuentra un PendingIntent
coincidente, los "extras" de PendingIntent
serán reemplazados por los "extras" en el Intent
que se pasa como parámetro al método getxxx()
. Si no se encuentra PendingIntent
coincidente, se crea una nueva (este es el comportamiento normal). Esto se puede utilizar para cambiar los "extras" en un PendingIntent
existente donde ya ha dado el "token" a otras aplicaciones y no quiere invalidar el PendingIntent
existente.
Permítanme tratar de abordar su problema específico:
No puede haber más de un PendingIntent
activo en el sistema si el código de solicitud, la acción, los datos, el tipo y los parámetros de paquete / componente son los mismos. Por lo tanto, su requisito de poder tener hasta 35 PendingIntent
activos s con el mismo código de solicitud, acción, datos, tipo y parámetros de paquete / componente, pero con diferentes "extras", no es posible.
Sugiero que utilice 35 códigos de solicitud diferentes o cree 35 diferentes parámetros de "acción" únicos para su Intent
.
Sí, es posible poner una acción de intención única para cada alarma
Intent.setAction ("uniqueCode");
Intent intent = new Intent(context, MyAlarmReciver.class); intent.setAction("uniqueCode"); PendingIntent pendingIntent = PendingIntent.getBroadcast(activity, 0, intent, 0); AlarmManager alarmManager = (AlarmManager) context.getSystemService(activity.ALARM_SERVICE); Calendar c = Calendar.getInstance(); c.add(Calendar.MINUTE, 1); alarmManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pendingIntent);
- ¿Cómo puedo obtener la diferencia entre dos fechas en android ?, intentado todo y publicar
- Tienda de cookies persistente con okhttp 2 en Android