Androidは、次のように現在の時刻、経過時間を取得APIを提供しています。
System.currentTimeMillis()
SystemClock.elapsedRealtime()
SystemClock.uptimeMillis()
それぞれのAPIを紹介して相違点について説明します。
System.currentTimeMillis()
現在時刻をUTC(1970年1月1日が0の時)のmillisecondに戻します。 デバイスに設定された現在の時刻を基準に戻すため、ネットワークが接続されて時刻が変更されたり緯度(Time zone)が変更され、UTCが変更されることがあります。
そのため、時間の差を計算するときに適していません。もちろん、短い間隔で使用する場合の問題になる可能性がほとんどありません。
上記のような理由から、 currentTimeMillis()
を使用するときは ACTION_TIME_TICK
、ACTION_TIME_CHANGED
、 ACTION_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
- Android - 振動、Vibrator、VibrationEffectの例
- Android - TabLayoutの実装方法(+ ViewPager2)
- Android - PackageManagerにPackage情報を取得する
- Android - ACTION_BOOT_COMPLETEDイベント受信
- Android - FusedLocationProviderClientに位置情報を取得する
- Android - GPS、Network位置情報を取得する(LocationManager)
- Android - Foreground Service実行
- Android - 時間、日付、変更イベント受信
- Android - currentTimeMillis()、elapsedRealtime()、uptimeMillis()
- Android-PowerManager WakeLock
- Android - ファイル入出力の例(Read、Write、内部、外部ストレージ)
- Android - Screen On / Offイベントの受信、状態確認
- Android - 他のアプリのServiceにバインド
- Android - Handler vs Executor
- Android - Darkmode有効にする方法
- Android - hasSystemFeature()、サポートされているFeature確認
- Android - アプリの権限を確認(Permission check)
- Android - インストールされてアプリリストをインポートする
- Android App Shortcuts実装
- Android - ContentProviderを実装、および例
- Android - AIDLを利用して、Remote Serviceの実装
- Android - Uri、Scheme、SSP(Scheme Specific Part)説明
- Android - アプリのインストール、削除、イベントダウンロード(BroadcastReceiverインテントを受け取る)
- Android - SharedPreferencesに簡単なデータを保存する方法
- Android - AlarmManagerにアラームを登録する方法、および例
- Android - Quick SettingsにCustom Tile追加する方法(kotlin)
- Android - Broadcast Receiver登録およびイベントの受信方法
- Android - Runtime permissionリクエスト方法と例(kotlin)
- Android - ネットワーク(WIFI)の接続状態を確認し、変更の検出
- Mockito - static、final methodをmockingする方法
- Andriod - カスタムパーミッションを定義する方法
- RobolectricにUnit Testを作成する(kotlin)
- Android Mockitoのテストコードを作成する(kotlin)
- Android - Handlerの使用方法、および例
- Android - IntentService使用方法
- Android - JobIntentService使用方法