本指南将引导您构建一个基本的移动步数计数器应用程序,这是许多健康与健身应用程序的常用基础。
此工作流程集成了以下 API
- 传感器管理器 用于从移动设备检索步数数据。
- 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 管理 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