本指南将介绍如何构建基本的移动计步器应用, 是许多健康和健身应用。
此工作流集成了以下 API:
- SensorManager,用于从移动设备检索步数数据。
- Room。
- Health Connect 可用于在设备上存储和共享健康与健身数据。
如需有关数据读取和所需工具的其他支持,请参阅使用 使用 Android 传感器管理器在移动设备上跟踪步数。
如果您尚未针对使用 健康数据共享,请遵循以下指南 开始使用 步骤。
在手持设备上请求权限
在获取锻炼数据之前,您必须请求并获得适当的 权限。
最佳做法是只请求所需的权限,并确保 在上下文中请求每个权限,而不是请求全部 权限。
许多锻炼应用依赖的计步器传感器使用
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