2010-11-30 18 views
63

Soy la creación de una alarma de esta manera:Android: Obtener todos los PendingIntents establecidos con AlarmManager

alarmManager.set(AlarmManager.RTC_WAKEUP, alarmTime, pendingEvent); 

estoy interesado en eliminar todas las alarmas que en los casos indicados anteriormente, la limpieza de ellos.

¿Hay alguna manera de hacerlo o de obtener todas las alarmas actualmente configuradas para poder eliminarlas manualmente?

+6

Estos chicos muestra cómo enumerar las alarmas actuales: http://stackoverflow.com/questions/6522792/get-list-of- active-pendingintents-in-alarmmanager – slott

Respuesta

58

lo necesario para crear su intento en espera y luego cancelarlo

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

    Intent updateServiceIntent = new Intent(context, MyPendingIntentService.class); 
    PendingIntent pendingUpdateIntent = PendingIntent.getService(context, 0, updateServiceIntent, 0); 

    // Cancel alarms 
    try { 
     alarmManager.cancel(pendingUpdateIntent); 
    } catch (Exception e) { 
     Log.e(TAG, "AlarmManager update was not canceled. " + e.toString()); 
    } 
+1

Correcto. No es posible consultar AlarmManager para PendingIntents existentes. Tienes que mantener una referencia sobre ellos. – Emmanuel

+39

Sin referencia necesaria. alarmManager.cancel cancela todos ellos documentos: Elimina todas las alarmas que tengan un Intento coincidente. Cualquier alarma, de cualquier tipo, cuyo Intento coincida con este (según lo definido por filterEquals (Intención)), se cancelará. –

+5

¿Cómo guardo la referencia a ellos? Guardo todo en la base de datos Entonces, ¿cómo puedo mantener la referencia? – Arjit

78

Usted no tiene que mantener referencia a él. Simplemente defina un nuevo PendingIntent como exactamente el que definió al crearlo.

Por ejemplo:

si creé una PendingIntent para ser disparado fuera por el AlarmManager así:

Intent alarmIntent = new Intent(getApplicationContext(), AlarmBroadcastReceiver.class); 
    alarmIntent.setData(Uri.parse("custom://" + alarm.ID)); 
    alarmIntent.setAction(String.valueOf(alarm.ID)); 
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 

    PendingIntent displayIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, 0); 

    alarmManager.set(AlarmManager.RTC_WAKEUP, alarmDateTime, displayIntent); 

Entonces en algún lugar de su otro código (incluso otra actividad) se puede hacer esto para cancelar :

Intent alarmIntent = new Intent(getApplicationContext(), AlarmBroadcastReceiver.class); 
alarmIntent.setData(Uri.parse("custom://" + alarm.ID)); 
alarmIntent.setAction(String.valueOf(alarm.ID)); 
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 

PendingIntent displayIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, 0); 

alarmManager.cancel(displayIntent); 

lo importante aquí es establecer el PendingIntent con exactamente los mismos datos y la acción, y otros criterios, así como se ha dicho aquí http://developer.android.com/reference/android/app/AlarmManager.html#cancel%28android.app.PendingIntent%29

+5

+1 para alarmIntent.setData (Uri.parse ("custom: //" + alarm.ID)); alarmIntent.setAction (String.valueOf (alarm.ID)); – dhams

+0

@ gilsaints88: ¿puede explicarme cuál es la función de alarm.ID y cómo puedo declarar eso en mi actividad? –

+2

@mas_bejo alarm.ID en setData (...) es por la unicidad de la alarma para que podamos borrar cualquier alarma previamente configurada con la misma alarm.ID mientras se usaba setAction (...) para que la intención pasara de una notificación es el valor correcto cuando se devuelve a una actividad a través de onNewIntent(). Uso setData y setAction cuando configuro mi alarma y cuando la recibo de mi actividad proveniente de una notificación obtengo el intento anulando onNewIntent of Activity. la intención que obtengo es la correcta debido a setAction (...) anterior. Espero que esto ayude. – gilsaints88

7

Para cancelar una alarma no necesita volver a crear el mismo PendingIntent y pasar el mismo código de solicitud.

Así que he creado AlarmUtits para ayudarme a guardar todos los códigos de solicitud en las preferencias para cancelarlos en el futuro si es necesario. Todo lo que necesita es usar la siguiente clase y llamar a los métodos siguientes:

  • addAlarm para añadir una nueva alarma y aprobar un código de solicitud.
  • cancelAlarm Para eliminar una alarma, debe volver a crear el mismo
    Intención y pasar el mismo código de solicitud.
  • hasAlarm Para verificar si esa alarma se agregó, debe volver a crear el mismo Intención y pasar el mismo código de solicitud.
  • cancelAllAlarms para eliminar TODAS las alarmas establecidas.

Mis AlarmUtils

public class AlarmUtils { 

private static final String sTagAlarms = ":alarms"; 

public static void addAlarm(Context context, Intent intent, int notificationId, Calendar calendar) { 

    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, notificationId, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 
    } else { 
     alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 
    } 

    saveAlarmId(context, notificationId); 
} 

public static void cancelAlarm(Context context, Intent intent, int notificationId) { 
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, notificationId, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
    alarmManager.cancel(pendingIntent); 
    pendingIntent.cancel(); 

    removeAlarmId(context, notificationId); 
} 

public static void cancelAllAlarms(Context context, Intent intent) { 
    for (int idAlarm : getAlarmIds(context)) { 
     cancelAlarm(context, intent, idAlarm); 
    } 
} 

public static boolean hasAlarm(Context context, Intent intent, int notificationId) { 
    return PendingIntent.getBroadcast(context, notificationId, intent, PendingIntent.FLAG_NO_CREATE) != null; 
} 

private static void saveAlarmId(Context context, int id) { 
    List<Integer> idsAlarms = getAlarmIds(context); 

    if (idsAlarms.contains(id)) { 
     return; 
    } 

    idsAlarms.add(id); 

    saveIdsInPreferences(context, idsAlarms); 
} 

private static void removeAlarmId(Context context, int id) { 
    List<Integer> idsAlarms = getAlarmIds(context); 

    for (int i = 0; i < idsAlarms.size(); i++) { 
     if (idsAlarms.get(i) == id) 
      idsAlarms.remove(i); 
    } 

    saveIdsInPreferences(context, idsAlarms); 
} 

private static List<Integer> getAlarmIds(Context context) { 
    List<Integer> ids = new ArrayList<>(); 
    try { 
     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 
     JSONArray jsonArray2 = new JSONArray(prefs.getString(context.getPackageName() + sTagAlarms, "[]")); 

     for (int i = 0; i < jsonArray2.length(); i++) { 
      ids.add(jsonArray2.getInt(i)); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return ids; 
} 

private static void saveIdsInPreferences(Context context, List<Integer> lstIds) { 
    JSONArray jsonArray = new JSONArray(); 
    for (Integer idAlarm : lstIds) { 
     jsonArray.put(idAlarm); 
    } 

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 
    SharedPreferences.Editor editor = prefs.edit(); 
    editor.putString(context.getPackageName() + sTagAlarms, jsonArray.toString()); 

    editor.apply(); 
} 

}

Cuestiones relacionadas