คู่มือนี้จะแนะนำวิธีสร้างแอปนับก้าวพื้นฐานบนอุปกรณ์เคลื่อนที่ ซึ่งเป็นรากฐานทั่วไปของแอปด้านสุขภาพและการออกกำลังกายหลายแอป
เวิร์กโฟลว์นี้ผสานรวม 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