构建基本的健身应用

本指南将引导您构建基本的移动计步器应用,这是许多健康与健身应用的共同基础。

此工作流集成了以下 API:

  • SensorManager(用于从移动设备检索步数数据)。
  • Room - 用于本地数据存储。
  • Health Connect 用于在设备上存储和共享健康与健身数据。

如需进一步支持数据读取以及所需的工具,请参阅使用 Android 传感器管理器在移动设备上跟踪步数

如果您尚未针对使用 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 和 ViewModel,您可以更深入地了解此工作流。

此外,使用界面分层,这是使用 Compose 构建界面的关键部分,可让您遵循架构最佳实践,例如单向数据流。如需详细了解界面层,请参阅界面层文档

在此示例应用中,界面有三种基本状态:

  • 正在加载:显示旋转的圆圈。
  • 内容:显示今天的步数信息。
  • 错误:出现问题时显示消息。

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 界面会收集此 Flow 作为 Compose State,并对其执行操作:

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