Hướng dẫn này sẽ hướng dẫn bạn cách xây dựng một ứng dụng cơ bản đếm bước chân trên thiết bị di động. Đây là nền tảng phổ biến cho nhiều ứng dụng Sức khoẻ và thể dục.
Quy trình này tích hợp các API sau:
- SensorManager để truy xuất dữ liệu về số bước từ thiết bị di động.
- Room để lưu trữ dữ liệu cục bộ.
- Health Connect để lưu trữ và chia sẻ dữ liệu về sức khoẻ và hoạt động thể dục trên thiết bị.
Để biết thêm thông tin hỗ trợ về việc đọc dữ liệu và các công cụ cần thiết, hãy tham khảo bài viết Sử dụng Trình quản lý cảm biến Android để theo dõi số bước trên thiết bị di động.
Nếu bạn chưa thiết lập môi trường phát triển để sử dụng Health Connect, hãy làm theo các bước bắt đầu này.
Yêu cầu cấp quyền trên thiết bị cầm tay
Trước khi nhận dữ liệu về bài tập, bạn phải yêu cầu và được cấp các quyền thích hợp.
Theo phương pháp hay nhất, bạn chỉ nên yêu cầu những quyền cần thiết và nhớ yêu cầu từng quyền theo ngữ cảnh, thay vì yêu cầu tất cả các quyền cùng một lúc khi người dùng khởi động ứng dụng.
Cảm biến bộ đếm bước (nhiều ứng dụng tập thể dục dựa vào cảm biến này) sử dụng quyền ACTIVITY_RECOGNITION
. Thêm quyền này vào tệp 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>
Để yêu cầu quyền ACTIVITY_RECOGNITION
trong thời gian chạy, hãy tham khảo tài liệu yêu cầu cấp quyền.
Bạn cũng cần khai báo một FOREGROUND_SERVICE
trong tệp kê khai. Vì bạn đang yêu cầu quyền ACTIVITY_RECOGNITION
, hãy khai báo FOREGROUND_SERVICE_TYPE_HEALTH
:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_HEALTH"/>
Hãy truy cập vào trang Dịch vụ trên nền trước để tìm hiểu thêm về dịch vụ trên nền trước và các loại dịch vụ trên nền trước.
Quản lý trạng thái giao diện người dùng bằng ViewModel
Để quản lý trạng thái giao diện người dùng đúng cách, hãy sử dụng ViewModel. Jetpack Compose và ViewModel giúp bạn hiểu rõ hơn về quy trình này.
Ngoài ra, hãy sử dụng lớp giao diện người dùng. Đây là một phần quan trọng để tạo giao diện người dùng bằng Compose và cho phép bạn làm theo các phương pháp hay nhất về cấu trúc, chẳng hạn như Luồng dữ liệu một chiều. Để tìm hiểu thêm về việc phân lớp giao diện người dùng, hãy tham khảo tài liệu về lớp giao diện người dùng.
Trong ứng dụng mẫu này, giao diện người dùng có 3 trạng thái cơ bản:
- Đang tải: Hiển thị một vòng tròn xoay.
- Nội dung: Hiển thị thông tin về các bước của bạn trong ngày hôm nay.
- Lỗi: Hiện thông báo khi xảy ra sự cố.
ViewModel
hiển thị các trạng thái này dưới dạng Flow
Kotlin. Sử dụng một lớp được niêm phong để chứa các lớp và đối tượng đại diện cho các trạng thái có thể có:
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()
}
Sau đó, giao diện người dùng Compose sẽ thu thập Flow
này dưới dạng State
Compose và thao tác trên đó:
val state: TodayScreenState = todayScreenViewModel.currentScreenState.collectAsState().value