Begin, End Sleep Tracking
수면 측정을 위해, 앱은 밤 동안 지속적으로 레코딩, 데이터 처리, 네트워크 작업 등을 수행해야 합니다. 그러나 안드로이드 OS는 밤 사이 도즈 모드(Doze Mode)에 진입하여, 마이크 및 네트워크 리소스를 비활성화하거나 실행 중인 프로세스를 중단하는 등 다양한 제약을 가할 수 있습니다. 이로 인해 수면 측정 프로세스가 중단되는 문제가 발생할 수 있습니다.
이러한 문제를 해결하기 위해, 일반적으로 개발자는 포그라운드 서비스(Foreground Service)를 사용해 작업이 분리된 프로세스로 구현해야 합니다. 하지만, 이 방식은 개발 난이도가 높고 구현 과정이 복잡할 수 있습니다.
이를 간소화하기 위해, 우리는 이러한 복잡한 작업을 SDK 내부에서 모두 처리하여 추상화하였습니다. 이제 개발자는 단순히 beginSleepTracking() 및 endSleepTracking() 메서드를 호출하기만 하면 수면 측정을 손쉽게 시작하고 종료할 수 있습니다. 이를 통해 개발자의 부담을 최소화하고 수면 측정 기능을 보다 빠르고 안정적으로 구현할 수 있도록 지원합니다.
하드웨어 제어를 위한 추가 안내
단, 수면 중 슬립 스테이지(Sleep Stage) 값에 따라 하드웨어 제어가 반드시 보장되어야 하는 경우, SDK의 기본 제공 기능만으로는 제어에 한계가 있을 수 있습니다. 이러한 경우, 웹훅 서버(Webhook Server)를 활용한 제어를 구현하거나, 별도로 포그라운드 서비스(Foreground Service)를 직접 설계하여 수면 중단 없이 지속적으로 작업을 수행할 수 있도록 해야 합니다.
Begin SleepTracking
Asleep.beginSleepTracking()
- 이 함수는 수면 측정을 시작하는 역할을 하고 다음과 같은 작업이 자동으로 수행됩니다.
- 포그라운드 서비스 실행: 포그라운드 서비스가 자동으로 시작되며, 백그라운드 작업이 안정적으로 유지됩니다.
- 알림(Notification) 표시: Android 시스템 정책에 따라 포그라운드 서비스가 실행되는 동안, 사용자에게 수면 측정이 진행 중임을 알리는 알림(Notification)이 상태바에 표시됩니다. 이 알림은 수면 측정의 진행 상태를 명확히 전달하며, 필요 시 사용자 상호작용을 지원할 수 있습니다.
- 수면 측정 시작: SleepTrackingManager를 통해 수면 측정 프로세스가 즉시 시작됩니다.
beginSleepTracking(
asleepConfig: AsleepConfig,
notificationClass: Class<*>? = null,
notificationTitle: String? = null,
notificationText: String? = null,
notificationIcon: Int? = null,
asleepTrackingListener: AsleepTrackingListener
)
Parameter | Type | Description |
---|---|---|
asleepConfig | AsleepConfig | initAsleepConfig를 통해 전달받은 값 |
notificationClass | Class<*>? | 포그라운드 서비스 알림을 탭하였을 때 이동할 Activity |
notificationTitle | String? | 포그라운드 서비스 알림의 제목 |
notificationText | String? | 포그라운드 서비스 알림의 본문 |
notificationIcon | Int? | 포그라운드 서비스 알림의 아이콘 리소스 값 |
asleepTrackingListener | Asleep.AsleepTrackingListener | 수면 추적시 발생하는 콜백을 받을 리스너 |
Asleep.AsleepTrackingListener
- 수면 측정의 시작과 종료 및 상태에 대한 콜백을 제공하는 인터페이스 입니다.
interface AsleepTrackingListener {
fun onStart(sessionId: String)
fun onPerform(sequence: Int)
fun onFinish(sessionId: String)
fun onFail(errorCode: Int, detail: String)
}
Function | Parameter | Type | Description |
---|---|---|---|
onStart | sessionId | String | 측정이 시작되었을때 호출되고 측정하고 있는 세션에 대한 id가 전달됩니다. |
onPerform | sequence | Int | 30초마다 한번씩 분석을 진행하며 진행 상태에 대한 시퀀스값이 0부터 전달됩니다. |
onFinish | sessionId | String | 측정이 종료 되었을때 호출되고 측정이 종료된 세션에 대한 id가 전달됩니다. |
onFail | errorCode | Int | 측정 시작에서 종료까지의 과정중 에러가 발생하면 errorCode가 전달됩니다. |
detail | String | errorCode에 대한 부가설명 |
에러코드에 따른 종료 여부
다음과 같은 에러가 onFail()의 errorCode로 콜백되면 더이상 수면 측정을 할 수 없다고 판단하여 수면 측정이 자동으로 종료되어 onFinish()가 콜백 됩니다.
ERR_AUDIO, ERR_CREATE_FAILED, ERR_CREATE_UNAUTHORIZED, ERR_CREATE_CONFLICT, ERR_CREATE_VALIDATION, ERR_CREATE_SERVER_ERROR, ERR_UPLOAD_BAD_REQUEST, ERR_UPLOAD_UNAUTHORIZED, ERR_UPLOAD_FORBIDDEN, ERR_UPLOAD_NOT_FOUND, ERR_UPLOAD_TOO_LARGE, ERR_CLOSE_FAILED, ERR_CLOSE_BAD_REQUEST, ERR_CLOSE_UNAUTHORIZED, ERR_CLOSE_FORBIDDEN, ERR_CLOSE_NOT_FOUND, ERR_CLOSE_SERVER_ERROR
위의 에러가 아닌 다른 에러는 일시적으로 정상적인 측정이 될 수 없을지라도 측정이 종료 되지는 않습니다.
ERR_AUDIO_SILENCED, ERR_AUDIO_UNSILENCED, ERR_UPLOAD_FAILED
Asleep.getCurrentSleepData()
- 현재까지 측정된 실시간 수면 데이터를 받아옵니다.
Asleep.getCurrentSleepData(asleepSleepDataListener = object: Asleep.AsleepSleepDataListener {
override fun onSleepDataReceived(session: Session) {
}
override fun onFail(errorCode: Int, detail: String) {
}
})
Asleep.AsleepSleepDataListener
- 성공시, onSleepDataReceived 함수를 통해 Session의 값을 받아옵니다.
- 실패시, onFail 함수를 통해 errorCode를 받아옵니다.
interface AsleepSleepDataListener {
fun onSleepDataReceived(session: Session)
fun onFail(errorCode: Int, detail: String)
}
Asleep.isSleepTrackingProcessAlive()
- 이 함수는 현재 수면 측정이 진행 중인지를 확인하는 역할을 합니다. 포그라운드 서비스(Foreground Service)가 실행 중인 경우, true를 반환합니다.
- 앱이 실행될 때 이 함수를 호출하여 true가 반환되면, 현재 수면 측정이 진행 중임을 의미합니다. 이 경우, 사용자는 측정 상태를 직관적으로 알 수 있도록 수면 측정 중임을 나타내는 UI를 화면에 표시해야 합니다.
Asleep.isSleepTrackingProcessAlive(context: Context)
Asleep.connectSleepTracking()
- isSleepTrackingProcessAlive()이 true를 반환할 경우, 수면 측정이 정상적으로 진행 중임을 의미합니다. 이때, AsleepTrackingListener를 다시 등록하여 수면 측정 상태에 대한 이벤트 및 데이터를 수신할 수 있도록 구현해야 합니다. 이를 통해 수면 측정 프로세스와 UI 간의 상태 동기화를 유지할 수 있습니다.
Asleep.connectSleepTracking(asleepTrackingListener: AsleepTrackingListener)
End SleepTracking
Asleep.endSleepTracking()
이 함수는 beginSleepTracking()으로 시작된 수면 측정을 종료하는 역할을 합니다. 이 함수를 호출하면 수면 측정이 중단됨과 동시에 포그라운드 서비스(Foreground Service)도 종료되어, 수면 추적과 관련된 모든 프로세스가 안전하고 완전하게 종료됩니다.
Asleep.endSleepTracking()
Begin, End 방식의 Sleep Tracking에 대한 Sample App 을 참고하세요.
Updated 11 days ago