Создание простого фитнес-приложения

В этом руководстве рассказывается, как создать простое мобильное приложение для подсчета шагов, которое является основой для многих приложений для здоровья и фитнеса.

В этом рабочем процессе интегрированы следующие API:

  • SensorManager для получения данных о шагах с мобильного устройства.
  • Место для локального хранилища данных.
  • Здоровье и спорт – для хранения данных о здоровье и физической активности на устройстве и обмена ими.

Дополнительную информацию о считывании данных и необходимых инструментах можно найти в статье Как отслеживать шаги с помощью Android Sensor Manager.

Если вы ещё не настроили среду разработки для использования Health Connect, следуйте этим инструкциям.

Запрос разрешений на мобильном устройстве

Прежде чем получать данные о тренировках, необходимо запросить и получить соответствующие разрешения.

Рекомендуем запрашивать только необходимые разрешения и делать это в контексте, а не все сразу при запуске приложения.

Датчик шагов, который используется во многих приложениях для тренировок, запрашивает разрешение 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

Чтобы правильно управлять состоянием пользовательского интерфейса, используйте ViewModel. Подробнее об этом рабочем процессе рассказывается в статье Jetpack Compose и ViewModels.

Также используйте слои пользовательского интерфейса, которые являются важной частью создания пользовательских интерфейсов с помощью Compose и позволяют следовать лучшим архитектурным практикам, таким как однонаправленный поток данных. Подробнее о слое пользовательского интерфейса…

В этом примере у интерфейса есть три основных состояния:

  • Загрузка. Показывает вращающийся круг.
  • Контент. Информация о количестве шагов за сегодня.
  • Ошибка. Показывает сообщение, если что-то пошло не так.

ViewModel предоставляет эти состояния в виде Flow Kotlin. Используйте запечатанный класс, чтобы содержать классы и объекты, представляющие возможные состояния:

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 как State Compose и выполняет действия на его основе:

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