2010-11-30 5 views
63

J'installe une alarme comme ceci:Android: Obtenez tous PendingIntents serties AlarmManager

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

Je suis intéressé à supprimer toutes les alarmes où précédemment définis, les effacer.

Y a-t-il un moyen pour moi de faire cela ou d'obtenir toutes les alarmes qui sont actuellement définies pour pouvoir les supprimer manuellement?

+6

Ce gars montre comment la liste des alarmes actuelles: http://stackoverflow.com/questions/6522792/get-list-of- active-pendingintents-in-alarmmanager – slott

Répondre

58

Vous devez créer votre intention dans l'attente puis l'annuler

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

Correct. Il n'est pas possible d'interroger AlarmManager pour les PendingIntents existants. Vous devez garder une référence sur eux. – Emmanuel

+39

Aucune référence nécessaire. alarmManager.cancel annule tous les docs: Supprime toutes les alarmes avec une intention correspondante. Toute alarme, de quelque type que ce soit, dont l'intention correspond à celle-ci (définie par filterEquals (Intent)), sera annulée. –

+5

Comment garder la référence à eux Je stocke tout dans la base de données Alors, comment puis-je y faire référence? – Arjit

78

Vous ne devez pas garder référence. Définissez simplement un nouveau PendingIntent exactement comme celui que vous avez défini lors de sa création.

Par exemple:

si je créé un PendingIntent à décocha par le AlarmManager comme ceci:

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

Ensuite, quelque part dans votre autre code (même une autre activité), vous pouvez le faire annuler :

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

l'important ici est de mettre la PendingIntent avec exactement les mêmes données et l'action, et d'autres critères comme indiqué ci http://developer.android.com/reference/android/app/AlarmManager.html#cancel%28android.app.PendingIntent%29

+5

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

+0

@ gilsaints88: pouvez-vous m'expliquer, quelle est la fonction de alarm.ID et comment puis-je le déclarer dans mes deux activités? –

+2

@mas_bejo l'ID d'alarme sur setData (...) est pour l'unicité de l'alarme afin que nous puissions effacer toute alarme précédemment définie avec la même alarme.ID alors que la setAction (...) a été utilisée pour que l'intention passe d'un La notification est la bonne valeur lorsqu'elle est renvoyée à une activité via onNewIntent(). J'utilise setData et setAction lors de la configuration de mon alarme et lorsque je la reçois de mon activité en provenance d'une notification, j'obtiens l'intention en remplaçant le NouvelIntent d'Activité. l'intention que je reçois est la bonne en raison de setAction (...) plus tôt. J'espère que ça aide. – gilsaints88

7

Pour annuler une alarme, vous n'avez pas besoin de recréer le même PendingIntent et de transmettre le même code de requête. Donc, j'ai créé un AlarmUtits pour m'aider à sauvegarder tous les codes de demande dans les préférences pour l'annuler dans le futur si c'est nécessaire. Tout ce que vous avez besoin est d'utiliser la classe suivante et appelez les méthodes suivantes:

  • addAlarm pour ajouter une nouvelle alarme et passer un code de demande. Pour supprimer une alarme, vous devez la recréer
    Intention et transmettre le même code de requête.
  • hasAlarm Pour vérifier si cette alarme a été ajoutée, vous devez recréer la même intention et transmettre le même code de requête.
  • cancelAllAlarms pour supprimer TOUTES les alarmes définies.

Mes 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(); 
} 

}

Questions connexes