Tạo một ứng dụng thể dục cơ bản

Hướng dẫn này sẽ chỉ cho bạn cách tạo một ứng dụng cơ bản để đếm số bước 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ể hình.

Quy trình công việc này tích hợp các API sau đây:

  • SensorManager để truy xuất dữ liệu về số bước trên thiết bị di động.
  • Room để lưu trữ dữ liệu cục bộ.
  • Health Connect để lưu trữ cũng như 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 các bước bắt đầu sau.

Yêu cầu cấp quyền trên thiết bị cầm tay

Trước khi nhận được 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.

Cách tốt nhất là chỉ yêu cầu các quyền bạn cần 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 mà nhiều ứng dụng tập thể dục phụ thuộc vào 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 về yêu cầu quyền.

Bạn cũng sẽ cần khai báo FOREGROUND_SERVICE trong tệp kê khai. Vì bạn đang yêu cầu quyền ACTIVITY_RECOGNITION, nên 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 phần 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 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 để xây dựng giao diện người dùng bằng Compose và cho phép bạn tuân 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ề tính năng phân lớp giao diện người dùng, vui lòng 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 quay.
  • Nội dung: Hiển thị thông tin về các bước của bạn cho hôm nay.
  • Error (Lỗi): Hiển thị thông báo khi xảy ra sự cố.

ViewModel cho thấy 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 một State Compose và hoạt động trên đó:

val state: TodayScreenState = todayScreenViewModel.currentScreenState.collectAsState().value