2016-06-23 21 views
0

[OK]を間違って発射するので、私はアラームを設定しています:アンドロイドAlarmManager経過時間は

long triggerTime = SystemClock.elapsedRealtime() + mynterval; 

私は将来的には、比較のためtriggerTimeを保存してい

alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerTime, pendingIntent); 


alarmtriggerTimeより前に発砲していることがあります。例えば

、私がログに見ることができます:

scanTime: 702672466 
SystemClock.elapsedRealtime: 702672132 

何デルタエラーここに可能である - 1秒、2〜3秒以上?
なぜこのようなことが起こっていますか?

+0

あなたはどのAndroidバージョンでテストしていますか? –

+0

'setExact()'を使うと、5.1.1のデバイスになります。以前のデバイスの場合は、代わりに 'set()'メソッドを使用します。 –

+0

Allright、ドーズモードについての私の答えを見てください。とにかくデルタは2番目(最悪の場合)で、それはミリ秒単位で表示されます。 –

答えて

0

これはAndroid Doze Modeのために発生しています。

ユーザが画面をオフにして、一定期間抜い及び固定装置を離れる場合、デバイスは、Dozeモードに入ります。 Dozeモードでは、ネットワークやCPUを大量に消費するサービスへのアプリケーションのアクセスを制限することで、システムはバッテリを節約しようとします。

ここで、アラームはCPUを大量に消費するサービスの場合です。画像でわかるように、集中的なジョブは、いわゆるメンテナンスウィンドウで一緒に実行されます。 (setExact()setWindow()含む)

enter image description here

標準AlarmManagerアラームは、次のメンテナンスウィンドウに延期されます。 Dozeで起動中のアラームを設定する必要がある場合は、setAndAllowWhileIdle()またはsetExactAndAllowWhileIdle()を使用してください。 setAlarmClock()で設定されたアラームは正常に発火し続けます。システムは、これらのアラームが発生する直前にDozeを終了します。

+0

デバイスがPCに接続されていて、そのエラーの間に画面がオンになっているという興味深い点があります。そして、そのモードのために、トリガされた時間後にアラームが発動する可能性があります。しかし、私の場合、警報は以前発射されています。 –

関連する問題