web-dev-qa-db-fra.com

Différence entre setRepeating et setInexactRepeating of AlarmManager

Quels sont les paramètres des éléments suivants:

alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                AlarmManager.INTERVAL_FIFTEEN_MINUTES, alarmIntent);

Et parmi les suivants:

alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
        AlarmManager.INTERVAL_DAY, alarmIntent);

Quelle est la différence et comment les deux sont-ils différents en termes de fonctionnalités?

26
User3

Les deux exemples planifient une alarme répétitive qui enverra le alarmIntent donné. Dans les deux cas, la première fois qu'il sera envoyé sera immédiat (calendar.getTimeInMillis() renvoie l'heure actuelle ). Dans les deux cas, l'appareil sera réveillé lorsque l'alarme doit être envoyée (comme le montre AlarmManager.RTC_WAKEUP).

Il existe deux différences entre ces appels. Le plus simple est que l'intention sera envoyée toutes les quinze minutes lors du premier appel, et tous les jours lors du deuxième appel (comme vous pouvez le voir dans le troisième paramètre). La différence la plus compliquée est l'appel de la fonction elle-même: setRepeating programmera la première alarme pour exactement toutes les quinze minutes; setInexactRepeating programmera la deuxième alarme pour environ toutes les 24 heures, ce qui signifie qu'elle pourrait s'écarter de cet intervalle - avec l'avantage de consommer moins d'énergie .

Notez que cela a changé dans l'API 19, où ces deux appels sont synonymes. Voir ce guide , et cette documentation API .

35
PaF

Décidez de la précision de votre alarme

Le choix du type d'alarme est souvent la première étape de la création d'une alarme. Une autre distinction est la précision de votre alarme.

Pour la plupart des applications, setInexactRepeating() est le bon choix. Lorsque vous utilisez cette méthode, Android synchronise plusieurs alarmes répétitives inexactes et les déclenche en même temps . Cela réduit la décharge de la batterie.

Pour l'application rare qui a des exigences de temps rigides comme exemple, l'alarme doit se déclencher avec précision à 16h00. tous les jours puis utilisez setRepeating().

Référence: Décidez de la précision de votre alarme

16
Mehul Joisar

Pour augmenter les réponses précédentes, il existe un certain nombre d'autres bonnes pratiques à prendre en compte lors de l'utilisation d'alarmes répétitives, en particulier les alarmes inexactes demandées à l'aide de setInexactRepeating().

Type d'alarme

  • Les alarmes non WAKEUP sont meilleures que les alarmes WAKEUP du point de vue de la gestion de l'alimentation. En utilisant l'ancienne, votre alarme peut se déclencher tardivement, mais elle se déclenchera toujours soit lorsque l'appareil est réveillé par l'utilisateur, soit lorsqu'une autre alarme de réveil se déclenche. L'utilisation d'alarmes WAKEUP réveillera l'appareil hors de veille, consommant une batterie supplémentaire et provoquant potentiellement le déclenchement d'autres alarmes inexactes qui auraient pu être retardées autrement (ce qui réduit les avantages d'économie d'énergie par lots que fournissent les alarmes inexactes).
  • Préférez les alarmes utilisant la base de temps ELAPSED plutôt que la base de temps RTC. Les premières sont plus susceptibles d'avoir une distribution plus aléatoire sur les appareils que les alarmes RTC, ce qui réduit la risque de congestion du réseau et sur le serveur si l'alarme déclenche une sorte de sondage. Les téléphones exécutant Gingerbread (ou plus) souffrent d'un bogue par lequel RTC les alarmes inexactes ont tendance à s'aligner étroitement sur le horloge en temps réel, par exemple environ 30 secondes après chaque quart d'heure. Les alarmes ELAPSED ne souffrent pas de ce bogue sur ces versions antérieures de la plate-forme. Même si votre alarme ne déclenche aucune activité réseau, n'oubliez pas que s'il s'agit d'une alarme de réveil cela peut déclencher d'autres intentions d'alarme sans réveil susceptibles de frapper le réseau.

Base de temps

  • Veillez à spécifier l'heure de début demandée dans le domaine temporel correct pour le type d'alarme. Si vous ne le faites pas, des alarmes peuvent être définies dans le passé (elles se déclenchent immédiatement) si vous définissez une alarme RTC avec une base de temps ELAPSED ou dans le futur si vous définissez une alarme ELAPSED en utilisant le = RTC base de temps. Vous pouvez vérifier les alarmes qu'une application a planifiées à l'aide de dumpsys alarm via le adb Shell.

Intervalle

  • La spécification d'un intervalle d'alarme inexact de rien d'autre que les constantes d'intervalle définies dans l'API AlarmManager est redondante sur le SDK <19: elles seront programmées comme des alarmes exactes et non inexactes, perdant tous les avantages d'économie d'énergie fournis par les alarmes inexactes.

Edit: voici plus d'explications sur le bug relatif aux appareils Gingerbread et honeycomb 3.0: https://code.google.com/p/Android/issues/detail?id=3155

9
fingertricks

setRepeating est plus précis et setInexactRepeating sert à économiser la batterie mais pas précis, setInexactRepeating est bon pour la maintenance en arrière-plan par exemple et setRepeating est nécessaire par exemple pour le réveil.

4
Jesus Dimrix