¿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.

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?

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); 
  • Intentos pendientes no disparados
  • Enviar difusión al hacer clic en la notificación
  • AppWidget PendingIntent no funciona después de reiniciar el Lanzador
  • ¿En qué se utiliza "requestCode" en PendingIntent?
  • ¿Cómo puedo pasar correctamente los extras exclusivos a una intención pendiente?
  • Android: Inicie el servicio con Context.startService vs PendingIntent.getService
  • Transmisión global o transmisión local con PendingIntent
  • Cómo abortar BroadcastReceiver en android
  • ¿Por qué noftificaciones aparecen en la barra de notificación de Android por un tiempo, entonces desaparece
  • ¿Cómo puedo obtener los extras de Intent para un PendingIntent que ya está pendiente?
  • Notificación de DeleteIntent roto en versiones posteriores de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.