¿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
- Android: Apertura de actividad incorrecta del widget
- Widget no actualizado en el reinicio del lanzador
- AlarmManager, BroadcastReceiver y el servicio no funciona
- OnActivityResult para PendingIntent
- Cómo recibir notificaciones cuando se notifica una notificación
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?
- OnClick PendingIntent en widget a veces no funciona
- Problema con el Administrador de alarmas en Android 6.0 Doze mode
- Uso de AlarmManager para actualizar widgets manualmente
- Cancelación de una solicitud pendiente
- FLAG_CANCEL_CURRENT o FLAG_UPDATE_CURRENT
- Transmisión de datos del widget a la aplicación
- Utilizar two pendingIntent en una vista en Appwidget
- Android: la bandera de tareas no funciona para PendingIntent
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.
- Vistas dentro de un grupo de vistas personalizado que no se representan después de un cambio de tamaño
- ¿Cómo puedo ver qué wakelocks están activos?