برنامه ها اغلب نیاز به انجام بیش از یک کار در یک زمان دارند. API های اندروید راه های مختلفی را برای انجام این کار به شما ارائه می دهند. انتخاب گزینه مناسب بسیار مهم است. یک گزینه ممکن است برای یک موقعیت مناسب باشد اما برای موقعیت دیگر بسیار اشتباه است. انتخاب API های اشتباه می تواند به عملکرد برنامه یا کارایی منابع آسیب برساند، که می تواند باتری را تخلیه کند و عملکرد دستگاه کاربر را به طور کلی کاهش دهد. در برخی موارد، انتخاب روش اشتباه میتواند مانع از فهرست شدن برنامه شما در فروشگاه Play شود.
این سند گزینه های مختلف در دسترس شما را توضیح می دهد و به شما کمک می کند گزینه مناسب را برای موقعیت خود انتخاب کنید.
اصطلاحات
برخی از اصطلاحات مهم مربوط به وظایف پس زمینه ممکن است به روش های متعدد و متناقضی استفاده شوند. به همین دلیل، مهم است که اصطلاحات خود را تعریف کنیم.
اگر برنامهای در پسزمینه اجرا شود، سیستم محدودیتهایی برای آن اعمال میکند. (به عنوان مثال، در بیشتر موارد، یک برنامه در پسزمینه نمیتواند خدمات پیشزمینه را راهاندازی کند .)
برای اهداف این سند، ما از اصطلاح "وظیفه" به معنای عملیاتی استفاده می کنیم که یک برنامه خارج از گردش کار اصلی خود انجام می دهد. برای اطمینان از همسویی در درک، ما این را در سه دسته اصلی از انواع وظایف قرار دادهایم: کار ناهمزمان ، APIهای زمانبندی کار ، و خدمات پیشزمینه .
گزینه مناسب را انتخاب کنید
در بیشتر سناریوها، میتوانید APIهای مناسبی را که میتوانید برای کارتان استفاده کنید، با تعیین دسته ( کار ناهمزمان ، APIهای زمانبندی کار ، یا خدمات پیشزمینه ) تعیین کنید.
اگر هنوز مطمئن نیستید، میتوانید از نمودارهای جریانی که ما ارائه میکنیم استفاده کنید که تفاوتهای ظریف بیشتری را به تصمیم اضافه میکنند. هر یک از این گزینه ها در ادامه این سند با جزئیات بیشتر توضیح داده شده است.
دو سناریو اصلی برای انجام کارهای پس زمینه وجود دارد:
- کاری که در حالی که برنامه قابل مشاهده است توسط کاربر آغاز می شود
- این کار در پاسخ به یک رویداد، داخلی یا خارجی، آغاز می شود
این دو سناریو درخت تصمیم خود را دارند.
کار ناهمزمان
در بسیاری از موارد، یک برنامه فقط باید عملیات همزمان را در حالی که در پیش زمینه در حال اجرا است انجام دهد. به عنوان مثال، یک برنامه ممکن است نیاز به انجام یک محاسبه زمان بر داشته باشد. اگر محاسبه را روی رشته رابط کاربر انجام می داد، کاربر تا زمانی که محاسبه به پایان برسد نمی تواند با برنامه تعامل داشته باشد. این ممکن است منجر به یک خطای ANR شود. در چنین موردی، برنامه باید از گزینه کار ناهمزمان استفاده کند.
گزینه های معمول کار ناهمزمان عبارتند از Kotlin coroutines و thread های جاوا. می توانید اطلاعات بیشتری را در اسناد کار ناهمزمان بیابید. توجه به این نکته مهم است که برخلاف APIهای کار پسزمینه، اگر برنامه در مرحله چرخه حیات معتبر متوقف شود (به عنوان مثال، اگر برنامه از پیشزمینه خارج شود)، کار ناهمزمان تضمین نمیشود که به پایان برسد.
API های زمان بندی وظایف
APIهای زمانبندی وظایف زمانی که نیاز به انجام کارهایی دارید که نیاز به ادامه دارند حتی اگر کاربر برنامه را ترک کند، گزینه انعطاف پذیرتری هستند. در بیشتر موارد، بهترین گزینه برای اجرای وظایف پسزمینه استفاده از WorkManager است، اگرچه در برخی موارد ممکن است استفاده از پلتفرم JobScheduler
API مناسب باشد.
WorkManager یک کتابخانه قدرتمند است که به شما امکان می دهد کارهای ساده یا پیچیده را در صورت نیاز تنظیم کنید. میتوانید از WorkManager برای برنامهریزی کارها برای اجرا در زمانهای خاص استفاده کنید، یا شرایطی را که کار باید اجرا شود را مشخص کنید. شما حتی می توانید زنجیره ای از وظایف را تنظیم کنید، بنابراین هر کار به نوبه خود اجرا می شود و نتایج خود را به کار بعدی منتقل می کند. برای درک همه گزینههای موجود، فهرست ویژگیهای WorkManager را بخوانید.
برخی از رایج ترین سناریوها برای کارهای پس زمینه عبارتند از:
- واکشی داده ها از سرور به صورت دوره ای
- واکشی دادههای حسگر (مثلاً دادههای شمارنده گام)
- دریافت اطلاعات مکان دوره ای (باید مجوز
ACCESS_BACKGROUND_LOCATION
در Android 10 یا بالاتر را دریافت کنید) - آپلود محتوا بر اساس محرک محتوا، مانند عکس های ایجاد شده توسط دوربین
خدمات پیش زمینه
خدمات پیش زمینه یک راه قدرتمند برای اجرای فوری وظایفی که نباید قطع شوند ارائه می کنند. با این حال، سرویس های پیش زمینه به طور بالقوه می توانند بار سنگینی را بر دستگاه وارد کنند و گاهی اوقات پیامدهای حریم خصوصی و امنیتی دارند. به این دلایل، سیستم محدودیتهای زیادی را برای نحوه و زمان استفاده اپلیکیشنها از خدمات پیشزمینه اعمال میکند. به عنوان مثال، یک سرویس پیش زمینه باید برای کاربر قابل توجه باشد و در اغلب موارد برنامه ها نمی توانند سرویس های پیش زمینه را هنگامی که برنامه ها در پس زمینه هستند راه اندازی کنند. برای اطلاعات بیشتر، به مستندات خدمات پیش زمینه مراجعه کنید.
دو روش برای ایجاد یک سرویس پیش زمینه وجود دارد. شما می توانید Service
خود را اعلام کرده و با فراخوانی Service.startForeground()
مشخص کنید که این سرویس یک سرویس پیش زمینه است. از طرف دیگر، میتوانید از WorkManager برای ایجاد یک سرویس پیشزمینه استفاده کنید، همانطور که در پشتیبانی از کارگران طولانی مدت بحث شد. با این حال، مهم است که بدانید یک سرویس پیش زمینه ایجاد شده توسط WorkManager باید از تمام محدودیت های مشابه سایر خدمات پیش زمینه تبعیت کند. WorkManager فقط برخی از API های راحت را برای ایجاد یک سرویس پیش زمینه ساده تر ارائه می دهد.
API های جایگزین
این سیستم API های جایگزینی را ارائه می دهد که برای عملکرد بهتر برای موارد استفاده خاص طراحی شده اند. اگر یک API جایگزین برای مورد استفاده شما وجود دارد، توصیه میکنیم به جای سرویس پیشزمینه از آن API استفاده کنید زیرا باید به عملکرد بهتر برنامه شما کمک کند. اسناد انواع سرویس پیش زمینه زمانی را یادداشت می کند که یک API جایگزین خوب برای استفاده به جای یک نوع سرویس پیش زمینه خاص وجود دارد.
برخی از رایج ترین سناریوها برای استفاده از APIهای جایگزین عبارتند از:
- استفاده از انتقال داده توسط کاربر برای انجام بارگیری یا آپلود بزرگ، به جای ایجاد یک سرویس پیش زمینه همگام سازی داده ها
- استفاده از مدیر دستگاه همراه برای جفت شدن بلوتوث و انتقال داده، به جای استفاده از سرویس پیش زمینه دستگاه متصل
- استفاده از حالت تصویر در تصویر برای پخش ویدیو، به جای ایجاد سرویس پیش زمینه پخش رسانه
وظایفی که توسط کاربر آغاز شده است
اگر برنامهای نیاز به انجام وظایف پسزمینه دارد، و در حالی که برنامه قابل مشاهده است، عملیات توسط کاربر آغاز میشود، به این سؤالات پاسخ دهید تا رویکرد مناسب را بیابید.
آیا باید در حالی که برنامه در پسزمینه است، کار ادامه پیدا کند؟
اگر در حالی که برنامه در پسزمینه است، نیازی به ادامه اجرای کار نیست، باید از کار ناهمزمان استفاده کنید. تعدادی گزینه برای انجام کارهای ناهمزمان وجود دارد. نکته مهمی که باید درک کنید این است که اگر برنامه به پسزمینه برود، همه این گزینهها کار نمیکنند. (اگر برنامه خاموش شود، آنها نیز متوقف می شوند.) برای مثال، یک برنامه رسانه اجتماعی ممکن است بخواهد فید محتوای خود را به روز کند، اما اگر کاربر صفحه را ترک کند، نیازی به پایان عملیات نخواهد داشت.
اگر کار به تعویق بیفتد یا قطع شود، تجربه کاربری بدی ایجاد خواهد شد؟
این مهم است که در نظر داشته باشید اگر یک کار به تعویق بیفتد یا لغو شود، آیا تجربه کاربر آسیب می بیند یا خیر. برای مثال، اگر برنامهای نیاز به بهروزرسانی داراییهای خود داشته باشد، ممکن است کاربر متوجه نشود که این عملیات فوراً انجام میشود یا در نیمهشب هنگام شارژ مجدد دستگاه. در چنین مواردی باید از گزینه های پس زمینه کار استفاده کنید.
آیا این یک کار کوتاه و حیاتی است؟
اگر کار را نمی توان به تأخیر انداخت و به سرعت تکمیل می شود، می توانید از یک سرویس پیش زمینه با نوع shortService
استفاده کنید. ایجاد این سرویس ها نسبت به سایر سرویس های پیش زمینه آسان تر است و به مجوزهای زیادی نیاز ندارند. با این حال، خدمات کوتاه مدت باید در عرض سه دقیقه تکمیل شود.
آیا یک API جایگزین فقط برای این منظور وجود دارد؟
اگر کار برای کاربر نامرئی نباشد، راه حل صحیح ممکن است استفاده از سرویس پیش زمینه باشد. این سرویسها پس از شروع به کار بهطور مداوم اجرا میشوند، بنابراین زمانی که قطع کردن کار تجربه کاربری بدی داشته باشد، انتخاب خوبی هستند. به عنوان مثال، یک برنامه ردیابی تمرین ممکن است از حسگرهای مکان استفاده کند تا به کاربران اجازه دهد مسیر دویدن خود را روی نقشه ثبت کنند. شما نمی خواهید این کار را با گزینه کار پس زمینه انجام دهید، زیرا اگر کار متوقف شود، ردیابی بلافاصله متوقف می شود. در شرایطی مانند این، خدمات پیش زمینه بیشترین معنا را دارد.
با این حال، از آنجایی که سرویسهای پیشزمینه به طور بالقوه میتوانند از منابع دستگاه زیادی استفاده کنند، سیستم محدودیتهای زیادی را در مورد زمان و نحوه استفاده از آنها اعمال میکند. در بسیاری از موارد، به جای استفاده از یک سرویس پیش زمینه، می توانید از یک API جایگزین استفاده کنید که کار را با مشکل کمتری برای شما انجام می دهد. به عنوان مثال، اگر برنامه شما باید زمانی که کاربر به مکان خاصی میرسد، اقدامی انجام دهد، بهترین گزینه استفاده از geofence API به جای ردیابی موقعیت مکانی کاربر با یک سرویس پیشزمینه است.
وظایف در پاسخ به یک رویداد
گاهی اوقات یک برنامه باید در پاسخ به یک محرک کار پسزمینه انجام دهد، مانند:
- پیام های پخش شده
- پیامهای Firebase Cloud Messaging (FCM).
- آلارم های تنظیم شده توسط برنامه
این ممکن است یک محرک خارجی باشد (مانند یک پیام FCM)، یا ممکن است در پاسخ به زنگ هشدار تنظیم شده توسط خود برنامه باشد. برای مثال، یک بازی ممکن است یک پیام FCM دریافت کند که به آن میگوید برخی از داراییها را بهروزرسانی کند.
اگر می توانید مطمئن باشید که کار در چند ثانیه تمام می شود، از کار ناهمزمان برای انجام کار استفاده کنید. سیستم چند ثانیه به برنامه شما اجازه میدهد تا چنین کارهایی را انجام دهد، حتی اگر برنامه شما در پسزمینه باشد.
اگر کار بیش از چند ثانیه طول می کشد، ممکن است مناسب باشد که یک سرویس پیش زمینه برای انجام کار راه اندازی شود. در واقع، حتی اگر برنامه شما در حال حاضر در پسزمینه باشد، ممکن است اجازه راهاندازی یک سرویس پیشزمینه را داشته باشد، اگر کار توسط کاربر راهاندازی شده باشد و در یکی از معافیتهای تایید شده از محدودیتهای شروع پسزمینه قرار گیرد. به عنوان مثال، اگر یک برنامه یک پیام FCM با اولویت بالا دریافت کند، برنامه مجاز است یک سرویس پیش زمینه را راه اندازی کند، حتی اگر برنامه در پس زمینه باشد.
اگر کار بیش از چند ثانیه طول میکشد، از APIهای زمانبندی کار استفاده کنید.