음성 녹음 앱을 구현하다가 음성 녹음 도중 앱을 백그라운드로 돌리게 되었을 경우 앱을 일시중단 하는 기능을 구현하려 한다.
음성녹음을 하는 EchoScreen에서 해당 화면이 돌아오는지, 나가는지에 대한 여부를 확인하기 위해 produceState를 이용해 라이프사이크 별로 값을 가져오는 형태로 구현을 진행했다.
공식 문서를 보면 아래와 같이 적혀있다.
비 Compose 상태를 Compose 상태로 변환
produceState는 반환된 State로 값을 푸시할 수 있는 컴포지션으로 범위가 지정된 코루틴을 실행합니다.
이를 참조하여 라이프사이클에 따른 foreground 여부를 아래와 같이 구현했다.
@Composable
fun isAppInForeground(modifier: Modifier = Modifier): State<Boolean> {
return produceState(initialValue = true) {
val observer = LifecycleEventObserver { _, event ->
when (event) {
Lifecycle.Event.ON_START -> value = true
Lifecycle.Event.ON_STOP -> value = false
else -> Unit
}
}
//PrcessLifecycleOwner로 LifecycleEventObserver를 넣어 해당 화면 라이프사이클 변화에 따른 값을 등록 ProcessLifecycleOwner.get().lifecycle.addObserver(observer)
//해당 컴포저블이 Dispose 될 때 추가한 Observer를 삭제
awaitDispose {
ProcessLifecycleOwner.get().lifecycle.removeObserver(observer)
}
}
}
이제 이 정보를 토대로 LauchedEffect를 이용해 음성 녹음 중이고 foreground가 아닐 때 음성녹음을 중지하는 코드를 작성한다.
val isAppInForeground by isAppInForeground()
LaunchedEffect(isAppInForeground, state.recordingState) {
//상태가 녹음 중이면서 background 상태가 되면 중지하기
if(state.recordingState == RecordingState.NORMAL_CAPTURE && !isAppInForeground) {
viewModel.onAction(EchosAction.OnPauseRecordingClick)
}
}
정상적으로 백그라운드 진입 시 녹음이 중지 되는 것을 볼 수 있다.