สร้างแอปฟิตเนสขั้นพื้นฐาน

คู่มือนี้จะแนะนำวิธีสร้างแอปนับก้าวพื้นฐานบนอุปกรณ์เคลื่อนที่ ซึ่งเป็นรากฐานทั่วไปของแอปด้านสุขภาพและการออกกำลังกายหลายแอป

เวิร์กโฟลว์นี้ผสานรวม API ต่อไปนี้

  • SensorManager สำหรับดึงข้อมูลจำนวนก้าวจากอุปกรณ์เคลื่อนที่
  • ห้องสำหรับที่เก็บข้อมูลในพื้นที่
  • Health Connect สำหรับจัดเก็บและแชร์ข้อมูลสุขภาพและการออกกำลังกายในอุปกรณ์

หากต้องการความช่วยเหลือเพิ่มเติมเกี่ยวกับการอ่านข้อมูลและเครื่องมือที่จำเป็น โปรดดูใช้ Android Sensor Manager เพื่อติดตามจำนวนก้าวจากอุปกรณ์เคลื่อนที่

หากยังไม่ได้ตั้งค่าสภาพแวดล้อมการพัฒนาเพื่อใช้ Health Connect ให้ทำตามขั้นตอนการเริ่มต้นใช้งานต่อไปนี้

ขอสิทธิ์ในอุปกรณ์ถือ

ก่อนที่จะรับข้อมูลการออกกำลังกาย คุณต้องขอและได้รับสิทธิ์ที่เหมาะสม

แนวทางปฏิบัติแนะนำคือให้ขอเฉพาะสิทธิ์ที่จำเป็น และอย่าลืมขอสิทธิ์แต่ละรายการในบริบท แทนที่จะขอสิทธิ์ทั้งหมดพร้อมกันเมื่อผู้ใช้เริ่มแอป

เซ็นเซอร์นับก้าวซึ่งแอปออกกำลังกายหลายแอปใช้ จะใช้สิทธิ์ 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 ในไฟล์ Manifest ด้วย เนื่องจากคุณ กำลังขอสิทธิ์ ACTIVITY_RECOGNITION ให้ประกาศ FOREGROUND_SERVICE_TYPE_HEALTH ดังนี้

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_HEALTH"/>

ไปที่บริการที่ทำงานอยู่เบื้องหน้า เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับบริการที่ทำงานอยู่เบื้องหน้าและประเภทบริการที่ทำงานอยู่เบื้องหน้า

จัดการสถานะ UI โดยใช้ ViewModel

หากต้องการจัดการสถานะ UI อย่างถูกต้อง ให้ใช้ ViewModel Jetpack Compose และ ViewModel จะช่วยให้คุณได้เห็นเวิร์กโฟลว์นี้อย่างเจาะลึกมากขึ้น

นอกจากนี้ ให้ใช้การแบ่งเลเยอร์ UI ซึ่งเป็นส่วนสำคัญในการสร้าง UI ด้วย Compose และช่วยให้คุณปฏิบัติตามแนวทางปฏิบัติแนะนำด้านสถาปัตยกรรม เช่น การไหลของข้อมูลแบบทิศทางเดียว ดูข้อมูลเพิ่มเติมเกี่ยวกับการแบ่งชั้น UI ได้ในเอกสารประกอบเกี่ยวกับเลเยอร์ UI

ในแอปตัวอย่างนี้ UI มี 3 สถานะพื้นฐาน ได้แก่

  • กำลังโหลด: แสดงวงกลมหมุน
  • เนื้อหา: แสดงข้อมูลเกี่ยวกับจำนวนก้าวของคุณในวันนี้
  • ข้อผิดพลาด: แสดงข้อความเมื่อเกิดข้อผิดพลาด

ViewModel จะแสดงสถานะเหล่านี้เป็น Flow ของ Kotlin ใช้คลาสที่ปิดผนึกเพื่อ จัดเก็บคลาสและออบเจ็กต์ที่แสดงสถานะที่เป็นไปได้

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 นี้เป็น State ของ Compose และดำเนินการกับข้อมูลดังกล่าว

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