Android WorkManager چیست و چه کاربردی دارد؟

WorkManager چیست؟Android WorkManager یک کتابخانه پردازش پس‌زمینه (background processing)است که برای اجرای وظایف در پس‌زمینه استفاده می‌شود. این کتابخانه تضمین می کند که وظایف ما در هر صورت انجام شود اما ممکن است زمانی که می خواهد وظیفه ما را در پس زمینه انجام دهد رم پر باشد یا مشکل باتری داشته باشیم در نتیجه ممکن است دقیق سر موقع انجام نشود. به عنوان مثال (اگر قرار باشد یک آلارم در ساعت 8:30 به کاربر هشدار دهد اما در آن زمان رم پر باشد ممکن است بجای 8:30 در 8:30:5 هشدار دهد) بنابراین می توان گفت WorkManager یک روش تضمین شده برای انجام وظایف در اندروید است.با WorkManager می‌توانیم پردازش پس‌زمینه خود را حتی زمانی که اپلیکیشن اجرا نمی‌شود یا دستگاه به دلایلی راه‌اندازی مجدد می‌شود در نوبت قرار دهیم تا وظیفه ما در پس زمینه انجام شود. همچنین WorkManager به ما اجازه می دهد تا محدودیت های لازم برای اجرای وظیفه را تعریف کنیم.همچنین می توان گفت WorkManager یکی از اجزای معماری اندروید و بخشی از Android Jetpack است که به توسعه دهندگان کمک می کند برنامه های قوی، قابل آزمایش و قابل نگهداری را طراحی کنند.مزایای WorkManagerWorkManager نیز نسبت به پیشینیان خود مزایای زیادی دارد که به چند مورد آن به شرح زیر اشاره می کنیم: به تنهایی با نسخه های مختلف سیستم عامل سازگار می شود. با پیروی از بهترین شیوه ها، سیستم را سالم نگه می دارد. به کارهای ناهمزمان یکباره یا دوره ای اجازه می دهد. پشتیبانی ورودی/خروجی را برای وظایف زنجیره ای فراهم می کند. به شما امکان می دهد تعیین کنید که چه زمانی کار باید اجرا شود. بدون در نظر گرفتن راه اندازی مجدد برنامه یا دستگاه، وظایف اجرا می شوند.امکاناتWorkManager همچنین دارای چندین مزیت کلیدی دیگر به شرح زیر است: محدودیت کاری (Work Constraints) برنامه ریزی قوی (Robust Scheduling) سیاست امتحان مجدد انعطاف پذیر(Flexible Retry Policy) زنجیر کاری (Work Chaining) قابلیت همکاری درونی Threading (Built-In Threading Interoperability)برای درک امکانات ذکر شده ، اجازه دهید با چند مثال آن ها را بیشتر درک کنیم.محدودیت کاری (Work Constraints)با استفاده از Work Constraints می توانیم شرایط بهینه را برای اجرای کار تعریف کنیم. به عنوان مثال، فقط زمانی که دستگاه به اینترنت متصل است یا فضای ذخیره سازی کافی و غیره دارد اجرا شود.برنامه ریزی قوی (Robust Scheduling)WorkManager به توسعه‌دهنده اجازه می‌دهد تا با استفاده از پنجره‌های زمان‌بندی انعطاف‌پذیر موجود، کارها را برای اجرای یک‌باره یا دوره‌ای (مکرر) برنامه‌ریزی کند. همچنین می‌توان کار را برچسب‌گذاری کرد و آن را نیز نامگذاری کرد، تا بتوان کار منحصربه‌فرد و قابل تعویض را برنامه‌ریزی کرد و در صورت لزوم گروه‌های کار را با هم نظارت یا لغو کرد.سیاست امتحان مجدد انعطاف پذیر (Flexible Retry Policy)کار برنامه ریزی شده ممکن است به دلایل مختلف شکست بخورد اما WorkManager خط‌مشی‌های امتحان مجدد را ارائه می‌کند، بنابراین کاری که تعیین شده است هرگز نادیده گرفته نمی‌شود و داده‌ها هرگز از دست نمی‌روند.زنجیر کاری (Work Chaining)برای هر کار پیچیده، کارهای انفرادی زنجیره‌ای را می‌توان با استفاده از رابطی که به ما اجازه می‌دهد کنترل کنیم و تعیین کنیم که کدام یک به صورت متوالی و کدامیک به صورت موازی اجرا و به هم متصل شوند.قابلیت همکاری درونی Threading (Built-In Threading Interoperability)WorkManager به طور یکپارچه با RxJava و Coroutines ادغام می شود و انعطاف پذیری برای وصل کردن هر API ناهمزمان سفارشی را فراهم می کند.چه زمانی از WorkManager استفاده کنیم؟با تکامل سیستم‌عامل اندروید در طول سال‌ها، محدودیت‌هایی برای پردازش پس‌زمینه به منظور بهینه‌سازی مصرف باتری و استفاده بهینه از منابع دستگاه وجود دارد. هر نسخه جدید اندروید، که از اندروید مارشمالو (API (23شروع می‌شود، محدودیت‌هایی اضافه کرده است. بنابراین، مهم است که بهترین رویکرد پردازش پس‌زمینه را برای برنامه خود با توجه به نیاز خود انتخاب کنید.زمانی که کارهای پس‌زمینه‌ای شما باید تمام شود یا می‌تواند به تعویق بیفتد استفاده از WorkManager بهترین گزینه است در نتیجه قبل از شروع، ابتدا سوالاتی مانند زیر از خود بپرسید: آیا این کار باید در هر صورت انجام شود؟اگر اپلیکیشن توسط کاربر بسته شود، آیا باز هم انجام کار ضروری است؟ به عنوان مثال اگر در اپلیکیشن یادداشت برداری شما نیاز باشد که پس از پایان نوشتن یادداشت، حتما اطاعات به سمت سرور ارسال شود حتی اگر کاربر از اپلیکیشن بیرون برود یا سیستم عامل برای بازیابی مقداری حافظه باید برنامه را ببندد می توان ازWorkManager استفاده کرد زیرا پایان کارها را تضمین می کند. آیا کاری که می خواهیم انجام دهیم قابل تعویق است؟آیا می‌توانیم کار را بعداً اجرا کنیم یا فقط در صورتی مفید است که همین الان اجرا شود؟ اگر به مثال قبلی برگردیم، خوب است که یادداشت‌های خود را فورا آپلود کنید، اما اگر این امکان وجود نداشت و می توانیم همگام‌سازی را بعداً انجام دهیم. WorkManager به محدودیت‌های پس‌زمینه سیستم‌عامل احترام می‌گذارد و سعی می‌کند کار شما را به روشی کارآمد از باتری اجرا کند.بنابراین، به عنوان یک دستورالعمل، WorkManager برای کارهایی در نظر گرفته شده است که نیاز به تضمین اجرای سیستم دارند، حتی اگر کاربر از برنامه خارج شود. WorkManager برای کارهای پس زمینه ای که نیاز به اجرای فوری یا نیاز به اجرا در زمان دقیق دارند در نظر گرفته نشده است در نتیجه اگر نیاز دارید که کارتان در یک زمان دقیق اجرا شود (مانند ساعت زنگ دار یا یادآور رویداد) از AlarmManager استفاده کنید.به طور مختصر می توان گفت بهتر است در شرایط زیر از WorkManager استفاده شود:1. نیازی به اجرا در زمان خاصی ندارد.2. اگر کار ما به تعویق بیفتد مشکلی پیش نمی آید.3. وقتی نیاز داریم کار ما حتی پس از بسته شدن برنامه یا راه اندازی مجدد دستگاه اجرا شود4. وقتی که نیاز است محدودیت هایی مانند تامین باتری یا در دسترس بودن شبکه رعایت شود5. زمانی که در حال گوش دادن ( broadcasts) با استفاده از یک broadcast receiver هستید و سپس نیاز به شروع کار طولانی مدت دارید.چرا از WorkManager استفاده می کنیم؟هنگامی که WorkManager کار پس‌زمینه را اجرا می‌کند می تواند به تنهایی از مشکلات باتری و سیستم مراقبت کند در نتیجه توسعه دهندگان اندروید مایل هستند از آن استفاده کنند زیرا WorkManager بدون اینکه توسعه دهنده را اذیت کند کار را انجام می دهد. علاوه بر این، با استفاده از WorkManager می‌توانید هم وظایف دوره‌ای و هم زنجیره‌های پیچیده وابسته از وظایف را برنامه‌ریزی کنید: کار پس زمینه می توان به صورت موازی یا متوالی، با توجه به نیازهای شما اجرا شود.همچنین WorkManager به توسعه دهنده این امکان را میدهد که معیارهایی را برای زمان اجرای وظیفه در پس‌زمینه تعیین کند. به عنوان مثال، اگر دستگاه اتصال شبکه نداشته باشد، اپلیکیشن نمی تواند درخواست HTTP به سرور ارسال کند. بنابراین توسعه دهنده می تواند با استفاده از WorkManager محدودیتی را تنظیم کنید که این کار فقط زمانی اجرا شود که اتصال شبکه وجود داشته باشد.یکی دیگر از دلایل استفاده از WorkManager این است که از طریق آن می توانید مطمئن می‌شوید که وظایف شما حتی در شرایط ناپایدار نیز با استفاده از استراتژی‌های تلاش مجدد توسط WorkManager به درستی انجام شود. درنتیجه می توان گفت با استفاده از WorkManager امکان پیاده‌سازی راه‌حل‌های اطمینان‌آور برای اجرای وظایف در پس‌زمینه اپلیکیشن‌های اندروید فراهم می‌شود.در نهایت، WorkManager به شما امکان می دهد وضعیت درخواست کاری را مشاهده کنید تا بتوانید رابط کاربری خود را به روز کنید.زمانبندی WorkManager چگونه کار می کندهنگامی که درخواست کاری خود را در صف قرار می دهید، WorkManager آن را در پایگاه داده ذخیره می کند که به عنوان یک منبع منفرد حقیقت عمل می کند.پس از این، WorkManager درخواست کار را برای API 23 و بالاتر به JobScheduler ارسال می کند اما برای API زیر 23، WorkManager بررسی می کند که سرویس‌های Play روی دستگاه نصب شده باشد و با توجه به این موضوع درخواست کار را به GCM Network Manager ارسال می‌کند ولی اگر نصب نشده باشد، از Alarm Manager برای اجرای کار استفاده می کند.برای درک بهتر تصویر زیر را مشاهده کنید:نتیجه گیریWorkManager در اندروید یک کتابخانه قدرتمند برای اجرای وظایف در پس‌زمینه است. این کتابخانه از تضمین ادامه اجرا در شرایط ناپایدار، مدیریت زمانبندی اجرا، و API ساده برای توسعه‌دهندگان بهره می‌برد. با استفاده از WorkManager، می‌توان وظایف پیچیده را به صورت بهینه در پس‌زمینه اجرا کرده و از اطمینان اجرای موفقیت‌آمیز آنها در شرایط مختلف اطمینان حاصل کرد.بقیه آموزش های mister developer را می توانید در تلگرام و اینستاگرام دنبال کنید!!کانال تلگرام: mister_developerrاینستاگرام: mister_developerrامیدوارم این آموزش برای شما مفید بوده باشد.موفق و پیروز باشیدمنابع: https://androidgeek.co/getting-started-with-workmanager-beginner-in-depth-guide-8817df1ff7b https://developer.android.com/topic/libraries/architecture/workmanager https://medium.com/androiddevelopers/introducing-workmanager-2083bcfc4712 https://flexiple.com/android/android-workmanager-tutorial-getting-started#section6 https://www.kodeco.com/20689637-scheduling-tasks-with-android-workmanager https://medium.com/ivymobility-developers/android-workmanager-6c45f0a47808