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 14 - 사진/동영상 파일, 일부 접근 권한 소개
- Android - adb push, pull로 파일 복사, 다운로드
- Android 14 - 암시적 인텐트 변경사항 및 문제 해결
- Jetpack Compose - Row와 Column
- Android 13, AOSP 오픈소스 다운로드 및 빌드
- Android 13 - 세분화된 미디어 파일 권한
- Android 13에서 Notification 권한 요청, 알림 띄우기
- Android 13에서 'Access blocked: ComponentInfo' 에러 해결
- 에러 해결: android gradle plugin requires java 11 to run. you are currently using java 1.8.
- 안드로이드 - 코루틴과 Retrofit으로 비동기 통신 예제
- 안드로이드 - 코루틴으로 URL 이미지 불러오기
- Android - 진동, Vibrator, VibrationEffect 예제
- Some problems were found with the configuration of task 에러 수정
- Query method parameters should either be a type that can be converted into a database column or a List
- 우분투에서 Android 12 오픈소스 다운로드 및 빌드
- Android - ViewModel을 생성하는 방법
- Android - Transformations.map(), switchMap() 차이점
- Android - Transformations.distinctUntilChanged() 소개
- Android - TabLayout 구현 방법 (+ ViewPager2)
- Android - 휴대폰 전화번호 가져오는 방법
- Android 12 - Splash Screens 알아보기
- Android 12 - Incremental Install (Play as you Download) 소개
- Android - adb 명령어로 bugreport 로그 파일 추출
- Android - adb 명령어로 App 데이터 삭제
- Android - adb 명령어로 앱 비활성화, 활성화
- Android - adb 명령어로 특정 패키지의 PID 찾기
- Android - adb 명령어로 퍼미션 Grant 또는 Revoke
- Android - adb 명령어로 apk 설치, 삭제
- Android - adb 명령어로 특정 패키지의 프로세스 종료
- Android - adb 명령어로 screen capture 저장
- Android - adb 명령어로 System 앱 삭제, 설치
- Android - adb 명령어로 settings value 확인, 변경
- Android 12 - IntentFilter의 exported 명시적 선언
- Android - adb 명령어로 공장초기화(Factory reset)
- Android - adb logcat 명령어로 로그 출력