本指南將逐步說明如何建構基本的行動步數計數器應用程式,這是許多健康與健身應用程式的常見基礎。
這項工作流程整合了下列 API:
- SensorManager,可從行動裝置擷取步數資料。
- Room,用於本機資料儲存。
- 健康資料同步:用於儲存及分享裝置上的健康與健身資料。
如需有關讀取資料和必要工具的額外支援,請參閱「使用 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 管理 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