نمای کلی تکالیف پس‌زمینه

برنامه‌ها اغلب باید بیش‌از یک کار را در یک زمان انجام دهند. میاناهای برنامه‌سازی کاربردی Android روش‌های مختلفی برای انجام این کار ارائه می‌دهند. انتخاب گزینه مناسب بسیار مهم است؛ ممکن است گزینه‌ای برای یک موقعیت مناسب باشد اما برای موقعیت دیگر بسیار اشتباه باشد. انتخاب کردن میاناهای برنامه‌سازی کاربردی اشتباه می‌تواند به عملکرد یا کارایی منابع برنامه‌تان آسیب برساند، که می‌تواند باتری را خالی کند و عملکرد کلی دستگاه کاربر را کاهش دهد. در برخی موارد، انتخاب رویکرد اشتباه می‌تواند مانع از فهرست شدن برنامه‌تان در «فروشگاه Play» شود.

این سند گزینه‌های مختلفی را که برای شما دردسترس است توضیح می‌دهد و به شما کمک می‌کند گزینه مناسب را برای وضعیت خود انتخاب کنید.

اصطلاحات

برخی‌از اصطلاحات مهم مربوط به کارهای پس‌زمینه ممکن است به روش‌های متعدد و متناقضی استفاده شوند. به همین دلیل، مهم است که شرایطمان را تعریف کنیم.

اگر برنامه‌ای در پس‌زمینه اجرا شود، سیستم تعدادی محدودیت برای آن اعمال می‌کند. (برای مثال، در اکثر موارد، برنامه‌ای که در پس‌زمینه است نمی‌تواند سرویس‌های پیش‌زمینه‌ای را راه‌اندازی کند.)

برای اهداف این سند، از اصطلاح «تکلیف» برای اشاره به عملیاتی که برنامه خارج از گردش کار اصلی خود انجام می‌دهد استفاده می‌کنیم. برای اطمینان از هم‌راستایی در درک، این موضوع را به سه دسته اصلی از انواع وظایف تقسیم کرده‌ایم: کار ناهمگام، میاناهای برنامه‌سازی کاربردی زمان‌بندی وظیفه، و سرویس‌های پیش‌زمینه‌ای.

گزینه مناسب را انتخاب کنید

در اکثر سناریوها، می‌توانید با مشخص کردن دسته‌ای که تکلیف در آن قرار می‌گیرد (کار ناهمگام، میاناهای برنامه‌سازی کاربردی زمان‌بندی تکلیف، یا سرویس‌های پیش‌زمینه‌ای)، میاناهای برنامه‌سازی کاربردی مناسب را برای استفاده در تکلیف خود پیدا کنید.

اگر هنوز مطمئن نیستید، می‌توانید از نمودارهای جریانی که ارائه می‌دهیم استفاده کنید که جزئیات بیشتری به تصمیم اضافه می‌کنند. هریک از این گزینه‌ها در ادامه این سند با جزئیات بیشتری شرح داده شده است.

دو سناریو اصلی برای درنظر گرفتن تکالیف پس‌زمینه وجود دارد:

این دو سناریو درخت تصمیم‌گیری خودشان را دارند.

کار غیرهمگام

در بسیاری از موارد، برنامه فقط باید عملیات هم‌زمان را درحین اجرا در پیش‌نما انجام دهد. برای مثال، ممکن است برنامه‌ای نیاز به انجام محاسباتی وقت‌گیر داشته باشد. اگر این محاسبه را در رشته میانای کاربر انجام می‌داد، کاربر نمی‌توانست تا پایان محاسبه با برنامه تعامل داشته باشد؛ این امر ممکن بود به خطای ANR منجر شود. در چنین مواردی، برنامه باید از گزینه کار ناهمگام استفاده کند.

گزینه‌های رایج کار ناهمگام شامل کوروتین‌های Kotlin و رشته‌های Java است؛ می‌توانید اطلاعات بیشتر را در سند کار ناهمگام پیدا کنید. باید توجه داشت که برخلاف میاناهای برنامه‌سازی کاربردی تکلیف پس‌زمینه، تضمینی وجود ندارد که کار ناهمگام درصورت خارج شدن برنامه از مرحله چرخه حیات معتبر (برای مثال، اگر برنامه از پیش‌زمینه خارج شود) به پایان برسد.

میاناهای برنامه‌سازی کاربردی زمان‌بندی تکلیف

وقتی لازم است کارهایی را انجام دهید که باید حتی درصورت خروج کاربر از برنامه ادامه یابند، میاناهای برنامه‌سازی کاربردی زمان‌بندی کار گزینه انعطاف‌پذیرتری هستند. در بیشتر موارد، بهترین گزینه برای اجرای کارهای پس‌زمینه استفاده از WorkManager است، اگرچه در برخی موارد ممکن است استفاده از میانای برنامه‌سازی کاربردی JobScheduler پلاتفرم مناسب باشد.

‫WorkManager کتابخانه قدرتمندی است که به شما امکان می‌دهد کارهای ساده یا پیچیده را براساس نیازتان راه‌اندازی کنید. می‌توانید از WorkManager برای زمان‌بندی تکالیف برای اجرا در زمان‌های خاص استفاده کنید، یا شرایطی را که تکلیف باید اجرا شود مشخص کنید. حتی می‌توانید زنجیره‌ای از تکالیف را راه‌اندازی کنید تا هر تکلیف به‌نوبت اجرا شود و نتایج خود را به تکلیف بعدی منتقل کند. برای درک همه گزینه‌های دردسترس، فهرست ویژگی‌های WorkManager را بخوانید.

برخی‌از رایج‌ترین سناریوها برای تکالیف پس‌زمینه عبارت‌اند از:

  • واکشی دوره‌ای داده‌ها از سرور
  • واکشی داده‌های حسگر (برای مثال، داده‌های شمارشگر قدم)
  • دریافت دوره‌ای داده‌های مکان (باید در Android نسخه ۱۰ یا بالاتر، اجازه ACCESS_BACKGROUND_LOCATION به شما اعطا شده باشد)
  • بارگذاری محتوا براساس راه‌انداز محتوا، مثل عکس‌های ایجادشده توسط دوربین

سرویس پیش‌زمینه‌ای

سرویس‌های پیش‌زمینه‌ای روشی قدرتمند برای اجرای فوری تکالیفی ارائه می‌دهند که نباید متوقف شوند. بااین‌حال، سرویس‌های پیش‌زمینه‌ای می‌توانند به‌طور بالقوه بار سنگینی بر دستگاه تحمیل کنند و گاهی‌اوقات پیامدهای حریم خصوصی و امنیتی دارند. به‌همین دلیل، سیستم محدودیت‌های زیادی برای نحوه و زمان استفاده برنامه‌ها از سرویس‌های پیش‌زمینه‌ای اعمال می‌کند. برای مثال، سرویس پیش‌زمینه‌ای باید برای کاربر محسوس باشد و در اکثر موارد، وقتی برنامه‌ها در پس‌زمینه هستند نمی‌توانند سرویس‌های پیش‌زمینه‌ای راه‌اندازی کنند. برای اطلاعات بیشتر، به اسناد سرویس‌های پیش‌زمینه‌ای مراجعه کنید.

دو روش برای ایجاد سرویس پیش‌زمینه‌ای وجود دارد. می‌توانید Service خودتان را اعلام کنید و با فراخوانی Service.startForeground() مشخص کنید که سرویس از نوع سرویس پیش‌زمینه‌ای است. یا می‌توانید از WorkManager برای ایجاد سرویس پیش‌زمینه‌ای استفاده کنید، همان‌طور که در پشتیبانی از کارگران طولانی‌مدت بحث شده است. بااین‌حال، باید بدانید که سرویس پیش‌زمینه‌ای ایجادشده توسط WorkManager باید از همان محدودیت‌هایی پیروی کند که برای هر سرویس پیش‌زمینه‌ای دیگری اعمال می‌شود. WorkManager فقط چند میانای برنامه‌سازی کاربردی راحت ارائه می‌دهد تا ایجاد سرویس پیش‌زمینه‌ای را ساده‌تر کند.

میاناهای برنامه‌سازی کاربردی جایگزین

سیستم میاناهای برنامه‌سازی کاربردی جایگزینی ارائه می‌دهد که برای عملکرد بهتر در موارد استفاده خاص‌تر طراحی شده‌اند. اگر میانای برنامه‌سازی کاربردی جایگزینی برای مورد استفاده شما وجود دارد، توصیه می‌کنیم به‌جای سرویس پیش‌زمینه‌ای از آن میانای برنامه‌سازی کاربردی استفاده کنید چون به عملکرد بهتر برنامه‌تان کمک می‌کند. در سند انواع سرویس پیش‌زمینه‌ای ذکر شده است که چه زمانی میانای برنامه‌سازی کاربردی جایگزین خوبی برای استفاده به‌جای نوع سرویس پیش‌زمینه‌ای خاص وجود دارد.

برخی‌از رایج‌ترین سناریوها برای استفاده از میاناهای برنامه‌سازی کاربردی جایگزین عبارت‌اند از:

  • استفاده از انتقال داده آغازشده ازسوی کاربر برای انجام بارگیری‌ها یا بارگذاری‌های بزرگ، به‌جای ایجاد سرویس پیش‌زمینه‌ای همگام‌سازی داده
  • استفاده از مدیر دستگاه همپا برای جفت‌سازی بلوتوث و انتقال داده، به‌جای استفاده از سرویس پیش‌زمینه‌ای دستگاه متصل‌شده
  • استفاده از حالت تصویردرتصویر برای پخش ویدیو، به‌جای ایجاد سرویس پیش‌زمینه‌ای بازپخش رسانه

تکالیف شروع‌شده توسط کاربر

روندنمایی که نحوه انتخاب میانای برنامه‌سازی کاربردی مناسب را نشان می‌دهد. این نمودار
  مطالب بخش «تکالیف آغازشده توسط کاربر» را خلاصه می‌کند.
شکل ۱: نحوه انتخاب کردن API مناسب برای اجرای تکلیف پس‌زمینه‌ای که کاربر شروع کرده است.

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

آیا لازم است تکلیف درحالی‌که برنامه در پس‌زمینه است همچنان اجرا شود؟

اگر لازم نیست اجرای تکلیف درحالی‌که برنامه در پس‌زمینه است ادامه یابد، باید از کار ناهمگام استفاده کنید. گزینه‌های متعددی برای انجام کار ناهمگام وجود دارد. نکته مهمی که باید بدانید این است که اگر برنامه به پس‌زمینه برود، همه این گزینه‌ها از کار می‌افتند. (اگر برنامه بسته شود، این اعلان‌ها نیز متوقف می‌شوند.) برای مثال، یک برنامه رسانه‌های اجتماعی ممکن است بخواهد فید محتوایش را بازآوری کند، اما اگر کاربر صفحه را ترک کند، نیازی به تکمیل عملیات نخواهد بود.

آیا اگر تکلیف معوق یا قطع شود، تجربه کاربری بدی ایجاد خواهد شد؟

مهم است که درنظر بگیرید آیا تجربه کاربری درصورت به‌تعویق افتادن یا لغو شدن تکلیف آسیب می‌بیند یا نه. برای مثال، اگر برنامه‌ای نیاز به به‌روزرسانی دارایی‌هایش داشته باشد، کاربر ممکن است متوجه نشود که این عملیات بلافاصله انجام می‌شود یا در نیمه شب زمانی که دستگاه درحال شارژ شدن است. در چنین مواردی، باید از گزینه‌های کار پس‌زمینه استفاده کنید.

آیا تکلیف کوتاه و مهمی است؟

اگر تکلیف را نمی‌توان به‌تأخیر انداخت و سریع تکمیل می‌شود، می‌توانید از سرویس پیش‌زمینه‌ای با نوع shortService استفاده کنید. ایجاد این سرویس‌ها نسبت‌به دیگر سرویس‌های پیش‌زمینه‌ای آسان‌تر است و به اجازه‌های زیادی نیاز ندارد. اما سرویس‌های کوتاه باید ظرف سه دقیقه تکمیل شوند.

آیا API جایگزینی فقط برای این منظور وجود دارد؟

اگر تکلیف برای کاربر نامرئی نیست، راه‌حل درست ممکن است استفاده از سرویس پیش‌زمینه‌ای باشد. این سرویس‌ها پس‌از شروع به‌طور مداوم اجرا می‌شوند، بنابراین وقتی وقفه در کار باعث تجربه کاربری بدی می‌شود، انتخاب خوبی هستند. برای مثال، برنامه ردیابی تمرین ممکن است از حسگرهای مکان استفاده کند تا به کاربران اجازه دهد مسیر دویدنشان را روی نقشه ضبط کنند. شما نمی‌خواهید این کار را با گزینه کار پس‌زمینه انجام دهید، زیرا اگر تکلیف موقتاً متوقف شود، ردیابی بلافاصله متوقف می‌شود. در چنین شرایطی، سرویس پیش‌زمینه‌ای منطقی‌ترین گزینه است.

بااین‌حال، چون سرویس‌های پیش‌زمینه‌ای به‌طور بالقوه می‌توانند از منابع زیادی در دستگاه استفاده کنند، سیستم محدودیت‌های زیادی برای زمان و نحوه استفاده از آن‌ها اعمال می‌کند. در بسیاری از موارد، به‌جای استفاده از سرویس پیش‌زمینه‌ای، می‌توانید از میانای برنامه‌سازی کاربردی جایگزین استفاده کنید که کار را با دردسر کمتری برای شما انجام می‌دهد. برای مثال، اگر برنامه‌تان باید وقتی کاربر به مکان خاصی می‌رسد کنشی انجام دهد، بهترین گزینه شما استفاده از میانای برنامه‌سازی کاربردی حصار جغرافیایی به‌جای ردیابی مکان کاربر با سرویس پیش‌زمینه‌ای است.

تکلیف‌های مربوط به پاسخ به رویداد

روندنمایی که نحوه انتخاب میانای برنامه‌سازی کاربردی مناسب را نشان می‌دهد. این نمودار
  مطالب بخش «تکالیف در پاسخ به رویداد» را خلاصه می‌کند.
شکل ۲: نحوه انتخاب کردن میانای برنامه‌سازی کاربردی مناسب برای اجرای تکلیف پس‌زمینه‌ای راه‌اندازی‌شده با رویداد.

گاهی اوقات لازم است برنامه‌ای در پاسخ به یک راه‌انداز، کار پس‌زمینه‌ای انجام دهد، مثلاً:

این ممکن است یک راه‌انداز خارجی (مانند پیام FCM) باشد، یا ممکن است در پاسخ به زنگ هشداری باشد که توسط خود برنامه تنظیم شده است. برای مثال، ممکن است بازی پیام FCM دریافت کند که به آن می‌گوید برخی‌از دارایی‌ها را به‌روز کند.

اگر مطمئن هستید که تکلیف در چند ثانیه تمام می‌شود، از کار ناهمگام برای انجام تکلیف استفاده کنید. سیستم به برنامه شما چند ثانیه فرصت می‌دهد تا چنین کارهایی را انجام دهد، حتی اگر برنامه شما در پس‌زمینه باشد.

اگر تکلیف بیشتر از چند ثانیه طول بکشد، ممکن است مناسب باشد که سرویس پیش‌زمینه‌ای برای رسیدگی به تکلیف شروع شود. درواقع، حتی اگر برنامه‌تان درحال‌حاضر در پس‌زمینه باشد، ممکن است اجازه داشته باشد سرویس پیش‌زمینه‌ای را شروع کند، به‌شرطی که تکلیف توسط کاربر راه‌اندازی شده باشد و در یکی از معافیت‌های تأییدشده از محدودیت‌های شروع در پس‌زمینه قرار بگیرد. برای مثال، اگر برنامه‌ای پیام FCM با اولویت بالا دریافت کند، برنامه مجاز است سرویس پیش‌زمینه‌ای را شروع کند، حتی اگر برنامه در پس‌زمینه باشد.

اگر تکلیف بیشتر از چند ثانیه طول می‌کشد، از میاناهای برنامه‌سازی کاربردی زمان‌بندی تکلیف استفاده کنید.