obtener gratis error como certificado android alarmmanager android-pendingintent

android - gratis - error vbscript



¿Es posible crear varios PendingIntents con el mismo código de solicitud y diferentes extras? (2)

Estoy usando AlarmManager para programar entre 1 y 35 alarmas (según la entrada del usuario). Cuando el usuario solicita programar nuevas alarmas, debo cancelar las alarmas actuales, por lo que creo todas mis alarmas con el mismo código de solicitud, 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 el sun (que es un CheckBox) marcado, programará una alarma para que se ejecute todos los domingos a la hour y los minute . Puede ver que cada alarma creada de esta manera tiene el mismo código de solicitud, pero la TOOL adicional cambia a veces para cada alarma.

Sin embargo, en mis pruebas, cuando se activa la alarma y se ejecuta mi Servicio, los extras de la Intención ahora son null . Esta pregunta sugiere que el uso de PendingIntent.FLAG_CANCEL_CURRENT resolverá esto, pero ¿eso no cancelaría los otros PendingIntents?

En breve:

¿Alguien puede explicar cómo funcionan los PendingIntents, en referencia a crear varios con el mismo código de solicitud y diferentes extras? ¿Qué banderas (si las hay) debo usar?


En realidad, usted no "crea" PendingIntent s. Los pides desde el framework de Android. Cuando solicita un PendingIntent del marco de Android, comprueba si ya existe un PendingIntent que coincida con los criterios que usted pasa como argumentos. Si es así, no crea un nuevo PendingIntent , solo le devuelve un "token" que apunta al PendingIntent existente. Si no encuentra un PendingIntent coincidente, creará uno y luego le devolverá un "token" que apunta al que acaba de crear. Hay algunos indicadores que puede configurar para modificar este comportamiento, pero no tanto. Lo más importante que hay que entender aquí es la forma en que el marco de Android se adapta.

Para hacer esto, verifica si los siguientes parámetros coinciden (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 la 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 el "componente" en la Intent deben ser el mismo (o ambos nulos). De lo contrario no coinciden. Los campos "paquete" y "componente" están configurados para la Intent "explícita" s.
  • La lista de "categorías" en la Intent debe ser la misma. De lo contrario no coinciden.

Debes notar que "extras" no está en la lista de arriba . Eso significa que si solicita un PendingIntent los "extras" no se tienen en cuenta cuando el marco de Android intenta encontrar un PendingIntent coincidente. Este es un error común que los desarrolladores cometen.

Ahora podemos abordar los indicadores adicionales que puede agregar para modificar el comportamiento de una solicitud PendingIntent :

FLAG_CANCEL_CURRENT - Cuando especifica este indicador, si se encuentra un PendingIntent coincidente, ese PendingIntent se cancela (elimina, elimina, invalida) y se crea uno nuevo. Esto significa que cualquier aplicación que tenga un "token" que apunte al antiguo PendingIntent no podrá usarlo porque ya no es válido.

FLAG_NO_CREATE : cuando 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 un PendingIntent coincidente, no se crea uno nuevo y la llamada simplemente devuelve un null . Esto se puede usar para determinar si hay un PendingIntent activo para un conjunto específico de parámetros.

FLAG_ONE_SHOT : cuando especifica este indicador, el PendingIntent que se crea solo se puede usar una vez. Eso significa que si le da el "token" para este PendingIntent a múltiples aplicaciones, después del primer uso del PendingIntent se cancelará (eliminará, eliminará, invalidará) para que cualquier intento futuro de usarlo falle.

FLAG_UPDATE_CURRENT - Cuando especifique este indicador, si se encuentra un PendingIntent coincidente, los "extras" en ese PendingIntent serán reemplazados por los "extras" en la Intent que pasa como parámetro al método getxxx() . Si no se encuentra un PendingIntent coincidente, se crea uno nuevo (este es el comportamiento normal). Esto se puede usar para cambiar los "extras" en un PendingIntent existente donde ya le ha dado el "token" a otras aplicaciones y no quiere invalidar el PendingIntent existente.

Déjame tratar de resolver tu problema específico:

No puede tener más de un PendingIntent activo en el sistema si los parámetros de código, acción, datos, tipo y paquete / componente de la solicitud son los mismos. Por lo tanto, su requisito de poder tener hasta 35 PendingIntent activos con el mismo código de solicitud, acción, datos, tipo y parámetros de paquete / componente, pero con diferentes "extras", no es posible.

Le sugiero que utilice 35 códigos de solicitud diferentes o cree 35 parámetros de "acción" únicos diferentes para su Intent .


Sí, es posible poner acción de intento único 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);