기본 피트니스 앱 빌드

이 가이드에서는 기본 모바일 걸음수 측정기 앱을 빌드하는 방법을 설명합니다. 많은 건강 및 의료 분야의 피트니스 앱을 탭합니다.

이 워크플로는 다음 API를 통합합니다.

  • SensorManager: 휴대기기에서 걸음 수 데이터를 검색합니다.
  • 로컬 데이터 저장소를 위한 Room
  • 헬스 커넥트: 기기에서 건강/피트니스 데이터를 저장하고 공유합니다.

데이터 읽기 및 필요한 도구에 대한 추가 지원은 휴대기기에서 걸음 수를 모니터링하는 Android 센서 관리자

아직 개발 환경을 설정하지 않은 경우 헬스 커넥트의 경우 다음을 따르세요. 시작하기 학습합니다.

휴대기기에서 권한 요청

운동 데이터를 얻으려면 먼저 적절한 권한을 부여할 수 있습니다

필요한 권한만 요청하는 것이 좋습니다. 모든 권한을 요청하는 대신 컨텍스트에 따라 각 권한을 요청합니다. 한 번에 여러 권한을 부여하는 데 사용될 수 있습니다.

많은 운동 앱이 사용하는 걸음수 측정기 센서ACTIVITY_RECOGNITION 권한 AndroidManifest.xml에 이 권한을 추가하세요. 파일:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools">

  <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>

</manifest>

런타임에 ACTIVITY_RECOGNITION 권한을 요청하려면 다음을 참고하세요. 권한 요청 문서를 참조하세요.

매니페스트에서 FOREGROUND_SERVICE도 선언해야 합니다. 내가 추천한 소식 ACTIVITY_RECOGNITION 권한을 요청하는 경우 FOREGROUND_SERVICE_TYPE_HEALTH:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_HEALTH"/>

포그라운드 서비스로 이동합니다. 를 참고하세요.

ViewModel을 사용하여 UI 상태 관리

UI 상태를 올바르게 관리하려면 ViewModel을 사용하세요. Jetpack Compose와 ViewModel에서 이 내용을 더 심층적으로 살펴볼 수 있습니다. 워크플로에 따라 다릅니다.

또한 Compose로 UI를 빌드하는 데 중요한 부분인 UI 레이어링을 사용합니다. 아키텍처 권장사항을 따를 수 있습니다 단방향 데이터 흐름. UI 레이어링에 대해 자세히 알아보려면 UI 레이어 문서

이 예시 앱에서 UI에는 세 가지 기본 상태가 있습니다.

  • 로드 중: 회전하는 원을 표시합니다.
  • 콘텐츠: 오늘의 걸음 수 정보가 표시됩니다.
  • 오류: 문제 발생 시 메시지를 표시합니다.

ViewModel는 이러한 상태를 Kotlin Flow로 노출합니다. 봉인 클래스를 사용하여 가능한 상태를 나타내는 클래스와 객체를 포함합니다.

class TodayScreenViewModel(...) {

  val currentScreenState: MutableStateFlow<TodayScreenState> = MutableStateFlow(Loading)

  [...]

}

sealed class TodayScreenState {
    data object Loading : TodayScreenState()
    data class Content(val steps: Long, val dailyGoal: Long) : TodayScreenState()
    data object Error: TodayScreenState()
}

그러면 Compose UI가 이 Flow를 Compose State로 수집하고 여기에서 작동합니다.

val state: TodayScreenState = todayScreenViewModel.currentScreenState.collectAsState().value