2014-01-20 14 views
20

Was sind die Parameter der folgenden Möglichkeiten:Unterschied zwischen setRepeating und setInexactRepeating von Alarmmanager

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

Und der folgenden Möglichkeiten:

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

Was ist der Unterschied und auch, wie in Bezug auf die beiden unterschiedlich sind von Funktionalität?

Antwort

25

Beide Beispiele planen einen wiederholenden Alarm, der die angegebene alarmIntent sendet. In beiden Fällen wird das erste Mal sofort gesendet (calendar.getTimeInMillis() gibt the current time zurück). In beiden Fällen wird das Gerät aufgeweckt, wenn der Alarm gesendet werden muss (siehe AlarmManager.RTC_WAKEUP).

Es gibt zwei Unterschiede zwischen diesen Aufrufen. Der einfachere ist, dass die Absicht alle 15 Minuten beim ersten Aufruf und jeden Tag beim zweiten Aufruf gesendet wird (wie Sie im dritten Parameter sehen können). Der kompliziertere Unterschied ist der Funktionsaufruf selbst: setRepeating plant den ersten Alarm für genau alle fünfzehn Minuten; setInexactRepeating plant den zweiten Alarm für ungefähr alle 24 Stunden, was bedeutet, dass er von diesem Intervall abweichen kann - mit dem Vorteil, weniger Strom zu verbrauchen.

Beachten Sie, dass dies in API 19 geändert hat, wo diese beiden Aufrufe synonym sind. Siehe this guide und this API documentation.

+0

Also, wenn ich SDK 18 Ziel und kip meine Max SDK 19, muss ich für beide separat Code? – User3

+0

Muss ich auch eine Wake-Sperre erwerben, wenn ich einen Dienst breche, der nach dem Auslösen des Alarms aufgerufen werden soll? – User3

+0

Ob für beide Fälle getrennt zu codieren ist Ihre Entscheidung und basiert auf Ihren Notwendigkeiten. Was ich Ihnen sagen kann ist, dass das Verhalten von 'setRepeating()' dem Verhalten von 'setInexactRepeating()' nur dann entspricht, wenn 'targetSdkVersion' 19 ist. Für jede niedrigere' targetSdkVersion' unterscheiden sich ihre Verhaltensweisen. – PaF

12

Entscheiden Sie, wie präzise Ihr Alarm

Die Wahl der Alarmtyp ist oft der erste Schritt bei der Schaffung eines Alarms sein muss. Eine weitere Unterscheidung ist, wie genau Sie Ihren Alarm benötigen. Für die meisten Apps ist setInexactRepeating() die richtige Wahl. Wenn Sie diese Methode verwenden, synchronisiert Android mehrere ungenau wiederholende Alarme und feuert sie gleichzeitig. Dies reduziert den Stromverbrauch der Batterie.

Für die seltene App, die strenge Zeitanforderungen als Beispiel hat, muss der Alarm um 16:00 Uhr genau ausgelöst werden. Jeden Tag verwenden Sie dann setRepeating().

Referenz: Decide how precise your alarm needs to be

+0

sehr gute Erklärung speziell über 'setRepeating()'. Vielen Dank. –

9

vorherigen Antworten zu erweitern, gibt es eine Reihe von anderen bewährten Verfahren zu berücksichtigen, wenn sich wiederholende Alarme verwenden, besonders ungenauen Alarme Verlangte setInexactRepeating() verwenden.

Alarm Typ

  • Nicht WAKEUP Alarme sind besser als WAKEUP Alarme von einer Power-Management-Perspektive. Wenn Sie den ersten Alarm verwenden, kann der Alarm zu spät ausgelöst werden, aber er wird immer noch ausgelöst, wenn das Gerät vom Benutzer geweckt wird oder wenn ein weiterer Weckalarm ausgelöst wird. Die Verwendung von WAKEUP-Alarmen weckt das Gerät aus dem Ruhezustand, verbraucht zusätzlichen Akku und verursacht möglicherweise andere ungenaue Alarme, die verzögert wurden und sich möglicherweise länger verzögert hätten (wodurch die stromsparenden Vorteile reduziert werden, die ungenaue Alarme bieten).
  • Bevorzugen Sie Alarme mit der ELAPSED-Zeitbasis und nicht mit der RTC-Zeitbasis. Erstere weisen eine größere zufällige Verteilung auf Geräte als RTC-Alarme auf, was das Risiko von Netzwerküberlastungen und auf dem Server verringert, wenn der Alarm irgendeine Art von Abfrage auslöst. Telefone, die Gingerbread (oder älter) laufen lassen, leiden unter einem Fehler, bei dem unrichtige RTC-Alarme dazu neigen, sich eng an die Echtzeituhr anzupassen, z. ungefähr 30 Sekunden nach jeder Viertelstunde. ELAPSED-Alarme leiden unter diesen früheren Plattformversionen nicht unter diesem Fehler. Auch wenn Ihr Alarm keine Netzwerkaktivität auslöst, denken Sie daran, dass bei einem Weckalarm andere Weckalarme ausgelöst werden können, die das Netzwerk treffen könnten.

Zeitbasis

  • Seien Sie vorsichtig die gewünschte Startzeit in dem richtigen Zeitbereich für den Alarmtyp angeben. Wenn Sie dies nicht tun, können Alarme in der Vergangenheit ausgelöst werden (sie werden sofort ausgelöst), wenn Sie einen RTC-Alarm mit einer ELAPSED-Zeitbasis oder weit in der Zukunft setzen, wenn Sie einen ELAPSED-Alarm mit der RTC-Zeitbasis einstellen. Sie können überprüfen, welche Alarme eine App geplant hat, indem Sie dumpsys alarm über die adb shell verwenden.

Interval

  • einen ungenauen Alarmintervall von etwas anderes als das Intervall Konstanten Angeben in den Alarmmanagern definiert API ist redundant auf SDK < 19: sie werden als nicht exakt ungenaue Alarme geplant werden, verlieren all die stromsparenden Vorteile, die ungenaue Alarme bieten.

Edit: hier ist eine weitere Erklärung der zu Lebkuchen im Zusammenhang Bug und 3.0-Geräte Bienenwabe: https://code.google.com/p/android/issues/detail?id=31550

1

setRepeating ist genauer und setInexactRepeating für das Speichern von Batterie ist aber keine genaue ist setInexactRepeating gut für die Wartung im Hintergrund zum Beispiel und setRepeating ist zum Beispiel für Wecker erforderlich.