2010-09-09 24 views
10

Tengo una aplicación que le recuerda a las personas que realicen sus tareas. Entonces, hay un PendingIntent, ahora el usuario puede eliminar la alarma cuando lo desee. En este código, solo hay un PendingIntent para múltiples alarmas de usuario, así que estoy confundido al cancelar esa alarma en particular donde los extras de intención son "pill". Las alarmas restantes no deben cancelarse. No tengo idea de este problema. Espero que esté claro. GraciasProblema al cancelar el AlarmManager - PendingIntent

Intent intent = new Intent(this, AlarmNotifyReceiver.class); 
intent.putExtra("Name_pill", "pill"); 
sender = PendingIntent.getBroadcast(this, 
DatabaseConstants.NOTIFICATION_ID + 1, intent, 
PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), sender); 
updateTheFlag(pillName[(pillName.length-1)]); 
+2

También estoy buscando una respuesta similar a esta pregunta. Estoy haciendo algo muy similar a ti, pero parece que no puedo hacerlo funcionar. Mi comprensión en este momento es que debe usar am.cancel (pendingIntent), lo que significa que necesitaría inicializar un pendiente pendiente idéntico al que hizo aquí. Sin embargo, eso no parece funcionar para mí. Cualquiera que pueda responder a esto seguramente obtendrá un voto favorable de mí :) –

Respuesta

5

Como dije en mi comentario, parece que sólo hay que volver a crear el mismo objeto exacto PendingIntent, y poner los mismos extras en ella. Luego, llame al

am.cancel(sender); 

Y su alarma específica debe cancelarse. No puedo encontrar una mejor manera de hacerlo, personalmente. Encontré esta información para confirmar mis expectativas elsewhere.

se lee:

repetición de alarmas tienen que ser canceladas para detenerlos. AlarmManager proporciona un método cancel() que requiere la misma clase de intención con la que se crea el intento. Así es como puedes cancelar la alarma.

alarmManager.cancel (pendingIntent);

Tenga en cuenta que el objeto pendingIntent no necesita ser el mismo objeto. Los campos de intención como acción, clase, categoría, etc. deben ser los mismos al crear la alarma. El intento se usa para identificar la alarma para cancelarla.

Es en el contexto de la repetición de alarmas, pero las alarmas de una sola vez debe ser cancelada de la misma manera, si no me equivoco. No puedo probarlo más a fondo solo porque estoy en el trabajo, pero esto debería funcionar.

+2

de acuerdo con la documentación de Android, para detener una alarma, debe crear un 'Intento' con los mismos datos, pero NO necesariamente los mismos extras: public void cancelar (operación PendingIntent) Eliminar cualquier alarma con un Intento correspondiente. Cualquier alarma, de cualquier tipo, cuyo Intento coincida con este (según lo definido por filterEquals (Intención)), se cancelará. – noloman

10

De acuerdo con la documentación de Android, con el fin de detener una alarma, se debe crear un Intent con los mismos datos, pero no necesariamente los mismos extras:

public void cancelar (operación PendingIntent)

Elimina todas las alarmas que tengan un Intento coincidente. Cualquier alarma, de cualquier tipo, cuyo Intento coincida con este> uno (según lo definido por filterEquals (Intención)), se cancelará.

filterEquals(Intent)

filterEquals public boolean (intención) otra

determinar si dos intentos son los mismos para los fines de la solución intención (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.

+0

Entonces, si tiene 2 'PendingIntent''s, creados en diferentes momentos que hacen exactamente lo mismo, ¿qué se debe usar para diferenciarlos? – Michael

1

creo que el parámetrorequestCode en getBroadcast() necesita ser mencionado. Acepto que todas las alarmas se cancelarán coincidiendo con la intención dada.Pero se puede hacer que una alarma sea única mediante el único requestCode al definir el PendingIntent para cancelar. Así que sólo aquellas alarmas serán cancelados que tiene el mismo intención y requestCode:

int TIMER_1 = 1; 
int TIMER_2 = 2; 
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); 
Intent i = new Intent(this, AppReciever.class); 
i.putExtra("timer", "one"); 
PendingIntent pending = PendingIntent.getBroadcast(this, TIMER_1, i, 
      PendingIntent.FLAG_CANCEL_CURRENT); 
Calendar cal = Calendar.getInstance(); 
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pending); 

a continuación, comprobar que la PendingIntent existir según this:

PendingIntent pending1 = PendingIntent.getBroadcast(this, TIMER_2, i, 
       PendingIntent.FLAG_NO_CREATE); 
boolean alarmUp = (pending1 != null); 

alarmUp habrá falsa (nota FLAG_NO_CREATE se utiliza para no crear uno nuevo si no existe) por lo que intenta con el mismo requestCode:

PendingIntent pending2 = PendingIntent.getBroadcast(this, TIMER_1, i, 
       PendingIntent.FLAG_NO_CREATE); 
alarmUp = (pending2 != null); 

alarmUp será cierto, ahora tratando con un nuevo intento contiene diferentes extra:

Intent i2 = new Intent(this, AppReciever.class); 
i2.putExtra("timer", "two"); 
pending2 = PendingIntent.getBroadcast(this, TIMER_1, i2, 
       PendingIntent.FLAG_NO_CREATE); 
alarmUp = (pending2 != null); 

alarmUp habrá cierto así ya que el i y i2 son los mismos aunque el extra no es así, ahora puede eliminar esta alarma:

am.cancel(pending2); 
0

Entonces hay un intento pendiente, ahora el usuario puede eliminar el alram cuando lo desea. Ib este código sólo hay una intención pendiente para múltiples alarmas de usuario, así que estoy confundido sobre la cancelación de esa alarma particular, donde extras es la píldora

intent.putExtra("Name_pill", "pill"); 

La costumbre trabajo suele extra para cancelar su intención pendiente.

pendingIntent.cancel() solo eliminará ese intento pendiente que se activó con el mismo filterEquals(Intent) y ese método no compara ningún dato adicional dado a la intención.

esta es la contienen de sitio de desarrolladores de Android filterEquals(Intent)

Determinar si dos intentos son los mismos a los efectos de la intención resolución (filtrado). Es decir, si su acción, datos, tipo, clase, y categorías son las mismas. Esto no compara ningún dato extra incluido en los intentos.

si tenemos en cuenta el escenario, cuando se pasa a que Extra a la intención en ese momento sólo es necesario para salvar la identificación única de alguna sharedpreference la que figura en el parámetro y una cosa su debe tener en cuenta que ID tiene que ser un único .

y y cuando supones para cancelar la alarma, sólo tiene que pasar misma intención con la que salvó ID y cancelar esa pendingintent.

Crear

preference_saved_value = DatabaseConstants.NOTIFICATION_ID + 1 
sender = PendingIntent.getBroadcast(this, 
preference_saved_value, intent, 
PendingIntent.FLAG_UPDATE_CURRENT) 

CANCELAR

sender = PendingIntent.getBroadcast(this, 
preference_saved_value, intent,PendingIntent.FLAG_UPDATE_CURRENT); 
sender.cancel() 
0

Como se indica en la documentación androide espera de intenciones con la intención de que son equivalentes según Intent.filterEquals pero tiene petición diferente el código se considera diferente:

Si realmente necesita objetos activos PendingIntent distinta múltiple en mismo tiempo (por ejemplo, para utilizar como dos notificaciones que se muestran ambos al mismo tiempo), entonces necesitará para asegurar que haya algo que es diferente sobre ellos para asociarlos con diferentes PendingIntents. Puede ser cualquiera de los atributos de intención considerados por Intent.filterEquals o diferentes enteros de código de solicitud suministrados a getActivity (Context, int, Intent, int), getActivities (Context, int, Intent [], int), getBroadcast (Context, int, Intent, int) o getService (Context, int, Intent, int).

Así, puede asignar diferentes códigos de solicitud y cancelar la base de intenciones pendientes sobre ellos y olvidarse del extra.

No era un escenario interesante que me di cuenta de este comportamiento:

Me programado una alarma en mi código y ejecutarlo en el dispositivo, pero nunca se canceló. Luego cambié el código de solicitud y lo volví a ejecutar. Entonces, se creó una nueva alarma. Cancelé la nueva alarma pero la alarma seguía ejecutándose desde el código anterior. Me confundo por qué la alarma no se cancela. Después de descubrir que era del código anterior con un código de solicitud diferente, desinstalé la aplicación y la volví a instalar y se resolvió el problema.

Cuestiones relacionadas