Android において long 型のタイムスタンプを取得する方法には、以下の 3 種類があり、それぞれ意味が異なるため、用途に応じて使い分ける必要があります。
- System. currentTimeMillis()
- Epoch (1970-01-01) を基準にしたシステムタイムまでの経過ミリ秒。
- ユーザがシステムの現在時刻を変更すると、過去にジャンプしたりするので、タイムスタンプベースのタイマーなどに使用するべきではない。時計の UI を表示するときに使用する。
- android.os.SystemClock. elapsedRealtime()
- Android 端末をブートしてからの経過ミリ秒。
uptimeMillis()
とは異なり、スリープ中にもカウントされる。 - AlarmManager はスリープ中の時間もカウントして発火するので、内部で
elapsedRealtime()
ベースのタイマを使用する。これは、AlarmManager のタイプでELAPSED_REALTIME (ELAPSED_REALTIME_WAKEUP)
を指定した場合の振る舞いで、RTC (RTC_WAKEUP)
を指定すれば、System.currentTimeMillis()
ベースのタイマで発火するように指定することもできる。
- Android 端末をブートしてからの経過ミリ秒。
- android.os.SystemClock. uptimeMillis()
- Android 端末をブートしてからの経過ミリ秒。スリープ中にはカウントされない。
- タイムスタンプベースのタイマーに使用できる。例えば
Handler
クラスは、uptimeMillis()
ベースのタイマを使用して非同期コールバックを発火している。
AlarmManager | Handler. postAtTime | Handler. sendMessageAtTime | |
---|---|---|---|
System. UTC | ○ RTC | × | × |
SystemClock. ブートからの経過時間 | ○ ELAPSED_REALTIME | × | × |
SystemClock. ブートからの経過時間 | × (スリープ時カウントできないため) | ○ | ○ |