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 - 앱 권한 요청 (kotlin)
- Android - 네트워크(WIFI) 연결 상태 확인 및 변경 감지
- Mockito - static, final method를 mocking하는 방법
- Andriod - 커스텀 퍼미션을 정의하는 방법
- Robolectric으로 Unit Test 작성하기
- Android Mockito로 Unit 테스트 코드 작성하기 (kotlin)
- Android - Handler 사용 방법
- Android - IntentService 사용 방법
- Android - JobIntentService 사용 방법