2012-01-16 16 views
8

He utilizado el mismo pendienteInternet para establecer varias alarmas usando diferentes intentId para cada una. la alarma esta funcionando. Ahora quiero cancelar una alarma en particular. Si utilizo el método cancel() terminaría cancelando todas las alarmas. Solo quiero que se elimine uno específico. Además, el usuario debería poder cancelar esta alarma incluso durante un segundo o tercer lanzamiento. Como cuando lo lance por segunda vez, no tendré el mismo objeto pendiente pendiente. ¿Tendré que persistir el objeto pendiente pendiente? ¿Si es así, cómo? y ¿cómo puedo cancelar una sola alarma desde múltiples alarmas?Cancelación de una sola alarma cuando tiene múltiples alarmas

+0

No conozco un método para cancelar una sola alarma después de un conjunto de alarmas con el mismo intento pendiente. Pero puede marcar una hora de alarma particular como cancelada usando algún método de persistencia (preferencias compartidas, un archivo, sqlite, ...) y en el código que se llama a través del intento de alarma evaluar la información guardada para determinar si la alarma ha sido cancelado. O puede cancelar todas las alarmas y configurar todas menos una después (si todavía sabe todas las veces). Por cierto, no necesitas el intento original pendiente, puedes crear uno nuevo. – Stefan

Respuesta

8

Usted puede hacerlo de esta manera,

En su intento Pendiente puede pasar un unique ID en lugar de requestCode

PendingIntent pi = PendingIntent.getBroadcast(context, unique_id, i, 0); 

y cancelar se puede use la misma identificación única para cancelarla, usando la misma intención pendiente.

am.cancel(pi); 

Para obtener más información se puede usar solo o Stackoverflow Google, por ahora creo this answer va a hacer por ti. :)

+0

Si configura su unique_id como hora de alarma en milisegundos, puede garantizar que será único. Por lo tanto, puede cancelarlo fácilmente. Verifiqué que esto funciona El método de calendario es calendar.getTimeInMillis() – bschwagg

3

Aquí hay una especie de truco para hacer esto con la explicación.

En primer lugar, debe crear una intención única para el intento pendiente. Para este propósito, puede crear un campo de datos personalizado de la intención de su aplicación. Lo hago de la siguiente manera:

Intent intent = new Intent(); 
intent.setAction(ExampleAppWidgetProvider.MY_INTENT_ACTION); 
Uri data = Uri.withAppendedPath(
       Uri.parse("myapp://myapp/Id/#"), 
       String.valueOf(intentId)); 
intent.setData(data); 

En su caso intentId será tuya identificador único de la intención.

A continuación, crea la notificación alarmManager como de costumbre. Para cancelar una alarma, debe seguir los siguientes pasos. Al principio deberías crear un intento como en la muestra del código anterior. Luego, crea un intento pendiente en función de esta intención (también crea el mismo intento pendiente para la alarma). Y luego se cancela esta alarma:

Intent intent = new Intent(); 
intent.setAction(ExampleAppWidgetProvider.MY_INTENT_ACTION); 
Uri data = Uri.withAppendedPath(
       Uri.parse("myapp://myapp/Id/#"), 
      String.valueOf(intentId)); 
intent.setData(data); 


PendingIntent pendingIntent = PendingIntent.getBroadcast(
       context, 0, intent, 
       PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
alarmManager.cancel(pendingIntent); 
Cuestiones relacionadas