Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Problema con la cancelación del AlarmManager – PendingIntent

Tengo una aplicación que recuerda a la gente a hacer sus tareas. Así que hay un PendingIntent, ahora el usuario puede eliminar la alarma cuando lo desee. En este código, sólo hay una 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 ser canceladas. No tengo ni idea de este problema. Espero que esté claro. Gracias

 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)]); 

  • Android AlarmManager problema con la configuración y restablecimiento de una alarma
  • ¿Cómo usar "goAsync" para broadcastReceiver?
  • Adición de diálogo de progreso de android dentro del servicio de fondo con AsyncTask, Obtención de excepción FATAL
  • New PendingIntent actualiza la intención actual
  • Android: Crear una sola tarea con actividades de varias aplicaciones (problema Lauchmode)
  • Extras de Android PendingIntent, no recibidos por BroadcastReceiver
  • Crea un nuevo intento pendiente cada vez en Android
  • ¿Es posible crear múltiples PendingIntents con el mismo requestCode y diferentes extras?
  • 5 Solutions collect form web for “Problema con la cancelación del AlarmManager – PendingIntent”

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

    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> uno (como se define por filterEquals (Intent) ), será cancelado.

    filterEquals(Intent)

    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.

    Como dije en mi comentario, parece que simplemente necesita recrear el mismo objeto PendingIntent y poner los mismos extras en él. Entonces, llame

     am.cancel(sender); 

    Y su alarma específica debe ser cancelada. No puedo encontrar una mejor manera de hacerlo, personalmente. Me pareció que esta información para confirmar mis expectativas en otro lugar .

    Se lee:

    Las alarmas de repetición tienen que ser canceladas para detenerlas. AlarmManager proporciona un método cancel () que requiere la misma clase de intención con la que se crea la intención. Así es como puede 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. La intención se utiliza para identificar la alarma para cancelarla.

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

    Creo que el parámetro getBroadcast() en getBroadcast() necesita ser mencionado. Estoy de acuerdo en que todas las alarmas serán canceladas coincidiendo con la Intención dada. Sin embargo, se puede hacer que una alarma sea única usando el único requestCode al definir el PendingIntent para cancelar. Tan solamente esas alarmas serán canceladas que tiene la misma 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); 

    Entonces compruebe que el PendingIntent existe según esto :

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

    alarmUp será 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á verdad , ahora intentando con una nueva intención contiene extra diferente:

     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 será cierto también ya que el i y el i2 son iguales aunque el extra no es, así que ahora usted puede quitar esta alarma:

     am.cancel(pending2); 

    Así que hay una intención pendiente, ahora el usuario puede eliminar el alram cuando lo desee. Ib Este código sólo hay una intención pendiente para múltiples alarmas de usuario, así que estoy confundido en la cancelación de esa alarma en particular, donde los extras es la píldora

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

    El extra no trabajará para cancelar su intención pendiente.

    pendingIntent.cancel() sólo eliminará la intención pendiente que se desencadena con el mismo filterEquals(Intent) y ese método no es comparar ningún dato adicional dado a la intención.

    Este es el contenido del sitio del desarrollador de android filterEquals(Intent)

    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.

    Si tenemos en cuenta su escenario, cuando usted va a pasar ese Extra a la intención en ese momento sólo tiene que guardar el ID único en alguna sharedpreference que en el parámetro y una cosa que debe tener en cuenta que el ID tiene que ser un único.

    Y cuando supone cancelar esa alarma, simplemente pase la misma intención con ese ID guardado y cancele ese 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() 

    Como se indica en la documentación de android pendientes intentos con intención que son equivalentes por Intent.filterEquals pero tienen código de solicitud diferente se consideran diferentes:

    Si realmente necesita varios objetos PendingIntent distintos activos al mismo tiempo (por ejemplo, para usarlos como dos notificaciones que se muestran al mismo tiempo), deberá asegurarse de que hay algo diferente sobre ellos para asociarlos a diferentes Pendientes. Esto puede ser cualquiera de los atributos de Intent 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).

    Por lo tanto, puede asignar diferentes código de solicitud y cancelar la base de intentos pendientes en ellos y olvidarse de la extra.

    Hubo un escenario interesante que me di cuenta de este comportamiento:

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

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.