ساختن برنامه تناسب اندام پایه

این راهنما شما را در ساختن یک برنامه گام‌شمار تلفن همراه پایه، که پایه مشترک بسیاری از برنامه‌های «سلامت و تناسب اندام» است، راهنمایی می‌کند.

این گردش کار میاناهای برنامه‌سازی کاربردی زیر را ادغام می‌کند:

  • SensorManager برای بازیابی داده‌های گام‌ها از دستگاه همراه.
  • فضای ذخیره‌سازی داده‌های محلی.
  • Health Connect برای ذخیره و هم‌رسانی داده‌های سلامتی و تناسب اندام در دستگاه.

برای پشتیبانی بیشتر درباره خواندن داده‌ها و ابزارهای لازم، به استفاده از «مدیر حسگر Android» برای پیگیری گام‌ها از دستگاه همراه مراجعه کنید.

اگر قبلاً محیط توسعه نرم‌افزار خود را برای استفاده از 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 و ViewModels نگاه عمیق‌تری به این گردش کار به شما ارائه می‌دهد.

همچنین، از لایه‌بندی UI استفاده کنید که بخش مهمی برای ساختن UI با 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 UI این Flow را به‌عنوان Compose State جمع‌آوری می‌کند و براساس آن عمل می‌کند:

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