Hướng dẫn này chỉ cho bạn cách xây dựng ứng dụng đếm số bước cơ bản trên thiết bị di động, là một nền tảng chung cho nhiều báo cáo Sức khoẻ & Ứng dụng thể dục.
Quy trình làm việc 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.
- Phòng để lưu trữ dữ liệu cục bộ.
- Health Connect để lưu trữ và chia sẻ dữ liệu sức khoẻ và thể chất trên thiết bị.
Để được hỗ trợ thêm 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 bắt đầu bước.
Yêu cầu cấp quyền trên thiết bị cầm tay
Trước khi nhận dữ liệu tập thể dục, bạn phải yêu cầu và được cấp quyền thích hợp quyền truy cập.
Tốt nhất là bạn chỉ nên yêu cầu các quyền bạn cần và đảm bảo yêu cầu từng quyền theo ngữ cảnh, thay vì yêu cầu tất cả quyền truy cập đồng thời khi người dùng khởi động ứng dụng.
Cảm biến bộ đếm bước (mà nhiều ứng dụng tập thể dục dựa vào) sử dụng
Quyền ACTIVITY_RECOGNITION
. Thêm quyền này vào AndroidManifest.xml
tệp:
<?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 về yêu cầu cấp quyền.
Bạn cũng cần khai báo 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"/>
Truy cập vào bài viết Dịch vụ trên nền trước để tìm hiểu thêm về các 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à ViewModels cung cấp cho bạn thông tin chuyên sâu hơn về vấn đề này quy trình làm việc.
Ngoài ra, hãy sử dụng tính năng phân lớp giao diện người dùng – một phần quan trọng để xây dựng 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 ví dụ 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 đang quay.
- Nội dung: Cho biết thông tin về các bước của bạn trong 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 kín để
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à hành động trên đó:
val state: TodayScreenState = todayScreenViewModel.currentScreenState.collectAsState().value