usando tutorial studio programar manager ejemplo cancel app alarma android alarmmanager repeat android-pendingintent

android - tutorial - ¿Cómo crear diferente pendiente pendiente para que filterEquals() devuelva falso?



tutorial alarmmanager (5)

Estoy usando AlarmManager para configurar intentos de repetición, pero ha causado algunos problemas pequeños, así que espero que alguien pueda ayudar.

Resumen

Hay 2 intentos pendientes. Uno corre a 1000 y otro corre a 2000 todos los días. Cada uno contiene un identificador de fila de la base de datos para fines de identificación. El código se ve algo como 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 eliminar uno de ellos. La forma correcta de eliminar un intento pendiente es configurar uno idéntico y luego cancelar la llamada desde AlarmManager.

Documentación de Android:

Cancelación pública anulada (operación pendiente)
Elimina cualquier alarma con un Intento correspondiente. Cualquier alarma, de cualquier tipo, cuya Intención coincida con esta (según lo definido por filterEquals (Intención)), se cancelará.

FilterEquals booleanos públicos (Intento otro)
Determine si dos intentos son los mismos para los propósitos de resolución de intentos (filtrado). Es decir, si su acción, datos, tipo, clase y categorías son iguales. Esto no compara ningún dato adicional incluido en los intentos.

Por lo tanto, en el ejemplo anterior, si hago una intención idéntica, entonces la cancelación, ambas intenciones se cancelarán, porque son de la misma clase / misma acción, etc. sobre datos adicionales).

¿Hay alguna solución para esto?


En mi caso, no tenía una buena manera de generar una clave única para mis intentos pendientes, así que lo que hice fue agregar datos personalizados 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 intento en el manifiesto de 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 singularidad en la intención antes de que se agregue como una intención pendiente, lo que es útil si se realizan pruebas unitarias.


Ponga la identificación de la tarea y una marca de tiempo en la acción de la intención. De esa manera, asociará el intento pendiente con el ID de tarea y los intentos seguirán siendo diferentes en términos de filtrado.

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


Puede intentar usar el parámetro requestCode al crear su intento 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.


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

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

Esto hará que filterEquals devuelva falso.

Necesitaba una solución similar para enviar notificaciones de SMS desde múltiples números, a fin de permitir que la notificación inicie el visor de hilos sms con diferentes números.


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 los extras no puede distinguir los Intents. Trate de establecer diferentes datos para estos intentos, los datos podrían ser Uris insignificantes.

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