Les alarmes

 

Les alarmes permettent de lancer des intentions à un moment précis.

L'avantage des alarmes est qu'elles fonctionnent indépendemment de votre application. Une fois paramétrée, elles fonctionneront toutes seules. Il s'agit en fait d'utiliser un service système qui va gérer ces alarmes pour vous.

AlarmManager alarms = (AlarmManager)getSystemService(Context.ALARM_SERVICE);

Image non trouvée ! Une alarme qui ne se serait pas déclenchée en temps et en heure sera déclenchée immédiatement par le système. De la même manière, si vous positionnez une alarme à une heure dépassée, elle sera déclenchée immédiatement.

Image non trouvée !Les alarmes devront être reprogrammées si l'appareil vient à être rebooté. Une solution sera d'utiliser un service s'exécutant automatiquement à la fin du reboot pour reprogrammer les alarmes.

 

Les différents types d'alarme

Il y a en tout quatre types d'alarmes (dont les constantes sont définies dans AlarmManager):

RTC_WAKEUP Réveil de l'appareil si nécessaire pour déclencher une intention à l'heure indiquée.

RTC déclencher une intention à l'heure indiquée. Si l'appareil est en sommeil, l'alarme ne sera pas déclecnchée jusqu'à ce que l'appareil sort de son sommeil.

ELAPSED_REALTIME_WAKEUP Réveil de l'appareil si nécessaire pour déclencher une intention au bout d'un certain laps de temps.

ELAPSED_REALTIME déclencher une intention au bout d'un certain laps de temps. Si l'appareil est en sommeil, l'alarme ne sera pas déclecnchée jusqu'à ce que l'appareil sort de son sommeil.

Programmer une alarme unique

Pour programmer une alarme, vous utiliserez la méthode set(). Elle sera unique, c'est à dire qu'aucune répétition ne sera faite de l'alarme.

void set(int type, long triggerAtMillis, PendingIntent operation)

Avec type, le type d'alarme utilisé

triggerAtMillis: suivant le type de l'alarme:

  • S'il s'agit du jour et de l'heure où doit se déclencher l'alarme..., utilisation de Calendar fortement conseillée, par exemple: Calendar calendar = Calendar.getInstance();
    calendar.set(2013, 11, 24, 23, 50);
    Image non trouvée !Sous Calendar, les mois commencent à 0, les jours à 1 !!!

    ms=calendar.getTimeInMillis() pour récupérer le tout au format ms qui est attendu par l'alarme.
  • S'il s'agit du laps de temps entre maintenant et l'alarme, en milliseconde ne pas oublier de multiplier par 1000, 1s = 1000ms (sans parler des conversions mn/seconde, ...). Pour le coût, éviter cette fois Calendar, qui consomme du temps...(pour un calendrier c'est presque marrant !)

operation est l'intent à lancer (En fait, utilisation de PendingIntent afin de fournir les droits/autorisations de l'application à l'activité qui sera lancée suite à l'alarme).

Image non trouvée !Il est possible de programmer plusieurs alarmes de différents types pour lancer des intentions. Cependant, si vous créez plusieurs alarmes avec le même objet Intent, alors seule la dernière alarme se déclenchera (En fait, toutes ses alarmes ne feront qu'une maj de l'alarme dont l'identifiant correspond à l'intent).

 

Programmer une alarme répétitive

Il existe deux méthodes:

Soit il faut être très précis:

void setRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)

 

Soit, la précision n'est pas nécessaire:

void setInexactRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)

 

Les paramètres sont identiques à celles d'une alarme unique en ajoutant simplement intervalMillis qui est l'intervalle de temps en ms avant les répétitions.

 

Image non trouvée !Voir le paragraphe " Interrompre une alarme" ci-dessous pour arrêter une répétition.

 

Des constantes

Vous pouvez vous aider des constantes suivantes pour définir une répétition ou pour déterminer une date/heure d'une alarme (Constantes qui sont déjà positionnées en ms):

long INTERVAL_DAY
long INTERVAL_FIFTEEN_MINUTES
long INTERVAL_HALF_DAY
long INTERVAL_HALF_HOUR
long INTERVAL_HOUR

Les opérations mathématiques seront possibles sur ces constantes (puisque correspondent au temps en ms). Par exemple 2 x INTERVAL_DAY = 2 jours.

 

Interrompre une alarme

Demain, c'est le weekend, je ne veux pas être réveillé !

Pour interrompre une alarme ou plusieurs, il suffit d'utiliser la méthode void cancel(PendingIntent operation)

Une alarme ou plusieurs car le paramètre à fournir pour la/les désactiver est PendingIntent operation que vous aurez défini précédemment. Si le même PendingIntent operation a été utilisé sur plusieurs alarmes, ce seront toutes ces alarmes qui seront désactivées. La comparaison se fait de la manière suivante:

Sur l'intention utilisée, appel à la méthode public boolean filterEquals (Intent other) qui permet de comparer deux intentions sur les action, data, type, classe, et categories. S'ils sont identiques, alors fin de l'alarme.

 

Exemple

A venir...

 

Annexes

Gérer des dates en JAVA (Calendar, System.currentTimeMillis(), ...)