В этом руководстве рассказывается, как создать простое мобильное приложение для подсчета шагов, которое является основой для многих приложений для здоровья и фитнеса.
В этом рабочем процессе интегрированы следующие 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