במדריך הזה נסביר איך ליצור אפליקציה בסיסית לנייד לספירת צעדים, שהיא בסיס נפוץ להרבה אפליקציות של בריאות וכושר.
תהליך העבודה הזה משלב את ממשקי ה-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
במניפסט. מכיוון שאתם מבקשים את ההרשאה ACTIVITY_RECOGNITION
, אתם צריכים להצהיר על FOREGROUND_SERVICE_TYPE_HEALTH
:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_HEALTH"/>
מידע נוסף על שירותים שפועלים בחזית ועל הסוגים שלהם זמין במאמר בנושא שירותים שפועלים בחזית.
ניהול מצב ממשק המשתמש באמצעות ViewModel
כדי לנהל את מצב ממשק המשתמש בצורה נכונה, צריך להשתמש ב-ViewModel. במאמר Jetpack Compose and ViewModels יש הסבר מפורט יותר על תהליך העבודה הזה.
בנוסף, כדאי להשתמש בשכבות של ממשק משתמש, שהן חלק חשוב ביצירת ממשקי משתמש באמצעות Compose, ומאפשרות לכם לפעול לפי שיטות מומלצות לארכיטקטורה, כמו זרימת נתונים חד-כיוונית. מידע נוסף על שכבות בממשק המשתמש זמין במסמכי התיעוד בנושא שכבת ממשק המשתמש.
באפליקציה לדוגמה הזו, לממשק המשתמש יש שלושה מצבים בסיסיים:
- טעינה: מוצג עיגול מסתובב.
- תוכן: מוצג מידע על הצעדים שלכם היום.
- שגיאה: מוצגת הודעה אם משהו משתבש.
ה-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 אוסף את Flow
כ-Compose State
ופועל בהתאם:
val state: TodayScreenState = todayScreenViewModel.currentScreenState.collectAsState().value