Android - currentTimeMillis()、elapsedRealtime()、uptimeMillis()

By JS | Last updated: December 23, 2020

Androidは、次のように現在の時刻、経過時間を取得APIを提供しています。

  • System.currentTimeMillis()
  • SystemClock.elapsedRealtime()
  • SystemClock.uptimeMillis()

それぞれのAPIを紹介して相違点について説明します。

System.currentTimeMillis()

現在時刻をUTC(1970年1月1日が0の時)のmillisecondに戻します。 デバイスに設定された現在の時刻を基準に戻すため、ネットワークが接続されて時刻が変更されたり緯度(Time zone)が変更され、UTCが変更されることがあります。

そのため、時間の差を計算するときに適していません。もちろん、短い間隔で使用する場合の問題になる可能性がほとんどありません。

上記のような理由から、 currentTimeMillis()を使用するときは ACTION_TIME_TICKACTION_TIME_CHANGEDACTION_TIMEZONE_CHANGEDブロードキャストを受けて時間変更の例外処理が必要です。

SystemClock.elapsedRealtime()

起動された時点から現在までの時間をmillisecondに戻します。つまり、起動直後には0を返し、10秒経ったら、10000が返されます。

重要なのは、デバイスがSleep状態にあっても、時間は測定がされます。もし起動されてから10秒過ぎ、この中に5秒Sleep状態ヨトオドAPIは、10秒を返します。

したがって、時間間隔(Interval)を測定するときは、このAPIを使用すると、お勧めします。

val startTime: Long = SystemClock.elapsedRealtime()

// do something

val endTime: Long = SystemClock.elapsedRealtime()
val interval = endTime - startTime

SystemClock.elapsedRealtimeNanos()

elapsedRealtimeNanos()elapsedRealtime()と同じように動作するが、nano secondsを返します。

SystemClock.uptimeMillis()

elapsedRealtime()と同様に起動された時点から現在までの時間をmillisecondに戻します。 重要なのは、デバイスがSleep状態にあるときは、時間を測定していません。つまり、起動してから10分となり、5分間Sleep状態であった場合、5分の時間だけmillisecondに戻します。

したがって、時間間隔を測定する際に、デバイスがSleepに、実際の時間差とは異なる計算され、問題になることができます。

参考

Related Posts

codechachaCopyright ©2019 codechacha