构建基本的健身应用

本指南将引导您构建一个基本的移动步数计数器应用,它是许多健康与健身应用的常见基础。

此工作流程集成了以下 API

  • SensorManager 用于从移动设备获取步数数据。
  • Room 用于本地数据存储。
  • Health Connect 用于在设备上存储和共享健康和健身数据。

有关数据读取和必要工具的更多支持,请参阅 使用 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 管理 UI 状态

要正确管理 UI 状态,请使用 ViewModel。 Jetpack Compose 和 ViewModel 提供了对此工作流程的更深入了解。

此外,使用 UI 分层,这是使用 Compose 构建 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