3

正確な時間間隔でアラームマネージャーを使用するには?

アラーム マネージャを使用しましたが、応答が不正確です。誰でも私を助けることができますか?このコードを使用しました

PendingIntent sender;
AlarmManager am;
long firstTime;
Intent itnt = new Intent();
itnt.setAction("abts.medismo.medismo.ALARMRECEIVER");
sender = PendingIntent.getBroadcast(context, 0,itnt, 0);
am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.cancel(sender);
firstTime = SystemClock.elapsedRealtime();
am.setInExactRepeating(AlarmManager.ELAPSED_REALTIME,firstTime, Integer.parseInt(sep[3]),  sender);
4

3 に答える 3

3

ELAPSED_REALTIME_WAKEUP電話機がスリープ状態の場合、再び起動するまで起動しないため、を使用する必要があります。

于 2012-11-02T07:32:25.893 に答える
0

観察された不正確さは、アラームのフラグの微妙な変化が原因である可能性があると思います。

AlarmManager.ELAPSED_REALTIMEデバイスが最後に起動してからのミリ秒数であるをAlarmManager.ELAPSED_REALTIME_WAKEUP利用します。これは、タイマーなどの経過時間を測定するのに適しています。elapsedRealtime()

AlarmManager.RTCシステムクロックであるをAlarmManager.RTC_WAKEUP利用します。currentTimeMillis()

1970年1月1日00:00:00UTCからのミリ秒単位の時間。システム時間を変更すると結果に影響を与える可能性があるため、この方法をタイムアウトやその他の経過時間の測定に使用しないでください。

AlarmManager私がリストした4つのクロックフラグにはすべて、スリープ中に費やされた時間が含まれますが*_WAKEUP、アラームを鳴らすためにデバイスをスリープ解除するのはフラグだけです。デフォルトのフラグは、デバイスが起動するまで待機し、すぐにアラームを鳴らします。

ユースケースに一致するフラグを選択し、delay { Integerat sep[3]?}の値がアラーム間の待機時間(ミリ秒)であることを確認してください。あなたがそれを持っているように、あなたIntegerは箱から出されて長いものにキャストされています。動作しますが、理由がない限り、プリミティブに切り替えることをお勧めしlongます。したがって、15分の遅延は次のようになります。

int delay = 900000L // 15 minutes * 60 seconds * 1000 milliseconds

http://developer.android.com/reference/android/app/AlarmManager.html

http://developer.android.com/reference/android/os/SystemClock.html

于 2012-11-02T07:46:01.203 に答える