¿Cómo crear different pendingintent para que filterEquals () devuelva false?

Estoy usando AlarmManager para configurar intentos repetidos, pero ha causado algunos pequeños problemas para que cualquier persona podría ayudar.

Resumen

Hay 2 intentos pendientes. Uno corre a 1000 y otro corre a 2000 cada día. Cada uno contiene un id de fila de la base de datos con fines de identificación. El código se parece a esto:

Intent i = new Intent(mContext, ScheduleReceiver.class); i.putExtra(RuleDBAdapter.KEY_ROWID, (int)taskId); PendingIntent pi =PendingIntent.getBroadcast(...); mAlarmManager.set(AlarmManager.RTC_WAKEUP, when.getTimeInMillis(), pi); 

Supresión:

El problema es cuando necesitamos borrar uno de ellos. La forma correcta de eliminar una intención pendiente es configurar una idéntica y luego cancelar la llamada desde AlarmManager.

Documentación de Android:

Public void cancel (operación de PendingIntent)
Elimine las alarmas con una intención coincidente. Cualquier alarma, de cualquier tipo, cuyo Intent coincida con este (como se define por filterEquals (Intent)), se cancelará.

Público booleano filterEquals (Intent other)
Determine si dos intenciones son las mismas para los propósitos de resolución de intenciones (filtrado). Es decir, si su acción, datos, tipo, clase y categorías son los mismos. Esto no compara ningún dato adicional incluido en los intentos.

Así que en el ejemplo anterior, si hago una intención idéntica y luego cancelo, ambas intenciones serán canceladas, ya que son de la misma clase / misma acción, etc (excepto el "extra" de datos es rowId, pero filterEquals no le importa Sobre datos adicionales).

¿Hay alguna solución para esto?

Puede intentar usar el parámetro requestCode al crear la intención pendiente:

 PendingIntent pi =PendingIntent.getBroadcast(mContext, yourUniqueDatabaseId,i,PendingIntent.FLAG_ONE_SHOT); 

Esto debería crear una Intención que sea única para propósitos de coincidencia.

Public boolean filterEquals (Intent other) compara la acción, los datos, el tipo, el paquete, el componente y las categorías, pero no compara el extra, por lo que la diferencia entre extras no puede distinguir Intents. Trate de establecer diferentes datos para estos intentos, los datos podrían ser Uris insignificante.

Trate de leer el código fuente para obtener más información.

Tratando de poner una acción ficticia en la intención. P.ej.

 myIntent.setAction(""+System.currentTimeMillis()); 

Esto hará que filterEquals devuelva false.

Necesitaba una solución similar para el envío de notificaciones sms de varios números, con el fin de permitir la notificación para iniciar el visor de hilos sms con números diferentes.

Coloque el id de tarea y una marca de tiempo en la acción de la intención. De esta manera, se asocia la intención pendiente con la ID de tarea y las intenciones seguirán siendo diferentes en términos de filtrado.

 intent.setAction("ACTION_" + taskId + "_" + currentTimestamp); 

En mi caso no tenía una buena manera de generar una llave única para mis intentos pendientes así que lo que lo hice era agregar datos de encargo a la intención generada.

Una vez que comience a llenar el atributo de datos, debe recordar agregar un parámetro de datos al filtro de intenciones en el manifiesto android. Si no lo hace, no activará su receptor personalizado.

Ejemplos:

intención

  Intent intent = new Intent(reminderFire); intent.addCategory(reminderCategory); Uri.Builder builder = new Uri.Builder(); builder.scheme(context.getString(R.string.scheme)); builder.authority(context.getString(R.string.intent_filter_reminder_host)); builder.appendQueryParameter("oid", Reminder.getOid()); intent.setData(builder.build()); 

Entrada de AndroidManifest

 <receiver android:name=".client.MyReminder" android:enabled="true" > <intent-filter> <action android:name="com.example.client.reminder.fire"/> <action android:name="com.example.client.reminder.category"/> <data android:host="@string/intent_filter_reminder_host" android:scheme="@string/scheme" /> </intent-filter> </receiver> 

Al hacer esto, también puede probar la unicidad en la intención antes de que se agregue como una intención pendiente, lo cual es útil si está realizando pruebas de unidad.

  • Pasando intención extra a receptor de radiodifusión android
  • Eliminar alarma de AlarmManager mediante cancel () - Android
  • Crea un nuevo intento pendiente cada vez en Android
  • ¿Llamando startActivity () desde fuera de una Actividad?
  • Extras de Android PendingIntent, no recibidos por BroadcastReceiver
  • Android: Crear una sola tarea con actividades de varias aplicaciones (problema Lauchmode)
  • Cómo reiniciar / actualizar el contenido de la actividad en la notificación haga clic
  • Intención de reanudar una actividad previamente detenida (llamada desde una notificación)
  • Android - ¿Por qué utilizar intenciones pendientes para geofences
  • PendingIntent obtener requestCode
  • Ocultar la acción del teléfono abierta en el uso
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.