وقتی میخواهید تکالیفی را اجرا کنید که حتی اگر برنامه از حالت نمایان خارج شود همچنان اجرا شوند، توصیه میکنیم از کتابخانه Jetpack WorkManager استفاده کنید. WorkManager دارای یک سازوکار زمانبندی قوی است که به تکالیف اجازه میدهد درطول بازراهاندازی برنامه و بازراهاندازی دستگاه پایدار بمانند.
انواع آثار
WorkManager سه نوع کار را مدیریت میکند:
- فوری: تکالیفی که باید فوراً شروع شوند و بهزودی تکمیل شوند. ممکن است تسریع شود.
- طولانیمدت: تکالیفی که ممکن است طولانیتر اجرا شوند، احتمالاً طولانیتر از ۱۰ دقیقه.
- قابلتعویق: تکالیف زمانبندیشدهای که در زمان دیگری شروع میشوند و میتوانند بهصورت دورهای اجرا شوند.
شکل ۱ نشان میدهد که انواع مختلف تکالیف چگونه با یکدیگر مرتبط هستند.
بهطور مشابه، جدول زیر انواع مختلف کار را نشان میدهد.
| نوع | تناوب | نحوه دسترسی |
|---|---|---|
| بیدرنگ | سر وقت | OneTimeWorkRequest و Worker. برای کار تسریعشده، setExpedited() را در OneTimeWorkRequest خود فراخوانی کنید. |
| طولانیمدت | یکباره یا دورهای | هر WorkRequest یا Worker. برای رسیدگی به اعلان، setForeground() را در Worker فراخوانی کنید. |
| قابلتعویق | یکباره یا دورهای | PeriodicWorkRequest و Worker. |
برای اطلاعات بیشتر درباره نحوه راهاندازی WorkManager، راهنمای تعریف کردن WorkRequests را ببینید.
ویژگیهای WorkManager
WorkManager علاوهبر ارائه یک API سادهتر و سازگارتر، مزایای کلیدی دیگری نیز دارد:
محدودیتهای کاری
شرایط بهینه را برای اجرای کارتان بااستفاده از محدودیتهای کار بهصورت اعلانی تعریف کنید. برای مثال، فقط زمانی اجرا شود که دستگاه به شبکه نامحدود متصل است، زمانی که دستگاه غیرفعال است، یا زمانی که باتری کافی دارد.
زمانبندی قوی
WorkManager به شما امکان میدهد بااستفاده از پنجرههای زمانبندی انعطافپذیر، کار را زمانبندی کنید تا یکبار یا بهطور مکرر اجرا شود. همچنین میتوان کارها را برچسبگذاری و نامگذاری کرد، که به شما امکان میدهد کارهای منحصربهفرد و قابلتعویض را زمانبندی کنید و گروههای کاری را باهم نظارت یا لغو کنید.
کار زمانبندیشده در پایگاه داده SQLite که بهصورت داخلی مدیریت میشود ذخیره میشود و WorkManager اطمینان حاصل میکند که این کار پایدار میماند و درصورت بازراهاندازی دستگاه دوباره زمانبندی میشود.
علاوهبراین، WorkManager از ویژگیهای صرفهجویی در مصرف برق و روالهای مطلوب مثل حالت چرت زدن پیروی میکند، بنابراین لازم نیست نگران آن باشید.
وظیفه تسریعشده
میتوانید از WorkManager برای زمانبندی کار فوری برای اجرا در پسزمینه استفاده کنید. باید از کار تسریعشده برای کارهایی استفاده کنید که برای کاربر مهم هستند و ظرف چند دقیقه تکمیل میشوند.
خطمشی تلاش مجدد انعطافپذیر
گاهیاوقات کار با شکست مواجه میشود. WorkManager خطمشیهای انعطافپذیری برای تلاش مجدد ارائه میدهد، ازجمله خطمشی عقبنشینی نمایی قابلپیکربندی.
زنجیرهسازی کار
برای کارهای پیچیده مرتبط، تکالیف کاری را بااستفاده از میانای بصری بههم زنجیر کنید تا بتوانید کنترل کنید کدام بخشها بهصورت متوالی و کدام بخشها بهصورت موازی اجرا شوند.
کاتلین
val continuation = WorkManager.getInstance(context) .beginUniqueWork( Constants.IMAGE_MANIPULATION_WORK_NAME, ExistingWorkPolicy.REPLACE, OneTimeWorkRequest.from(CleanupWorker::class.java) ).then(OneTimeWorkRequest.from(WaterColorFilterWorker::class.java)) .then(OneTimeWorkRequest.from(GrayScaleFilterWorker::class.java)) .then(OneTimeWorkRequest.from(BlurEffectFilterWorker::class.java)) .then( if (save) { workRequest<SaveImageToGalleryWorker>(tag = Constants.TAG_OUTPUT) } else /* upload */ { workRequest<UploadWorker>(tag = Constants.TAG_OUTPUT) } )
جاوا
WorkManager.getInstance(...) .beginWith(Arrays.asList(workA, workB)) .then(workC) .enqueue();
برای هر تکلیف کاری، میتوانید دادههای ورودی و خروجی آن کار را تعریف کنید. هنگام زنجیرهای کردن کارها، WorkManager بهطور خودکار دادههای خروجی را از یک تکلیف کاری به تکلیف بعدی منتقل میکند.
همکنشپذیری رشتهسازی داخلی
WorkManager بهطور یکپارچه با Coroutines و RxJava ادغام میشود و انعطافپذیری لازم را برای افزودن میاناهای برنامهسازی کاربردی ناهمگام خودتان فراهم میکند.
استفاده از WorkManager برای کار قابلاطمینان
WorkManager برای کارهایی درنظر گرفته شده است که لازم است بهطور مطمئن اجرا شوند، حتی اگر کاربر از صفحهای خارج شود، برنامه بسته شود، یا دستگاه بازراهاندازی شود. برای مثال:
- ارسال گزارشها یا تجزیهوتحلیلها به سرویسهای پسین.
- همگامسازی دورهای دادههای برنامه با سرور.
WorkManager برای کار پسزمینه درونفرایندی که درصورت ازبین رفتن فرایند برنامه بتواند بهطور ایمن خاتمه یابد درنظر گرفته نشده است. همچنین راهحل کلی برای همه کارهایی که نیاز به اجرای فوری دارند نیست. لطفاً راهنمای پردازش پسزمینهای را مرور کنید تا ببینید کدام راهحل نیازهای شما را برآورده میکند.
رابطه با میاناهای برنامهسازی کاربردی دیگر
این جدول نشان میدهد که WorkManager چگونه با میاناهای برنامهسازی کاربردی مشابه ارتباط دارد. این اطلاعات میتواند به شما کمک کند تا API مناسب را برای الزامات برنامهتان انتخاب کنید.
| API | توصیهشده برای | رابطه با WorkManager |
|---|---|---|
| Coroutines | همه کارهای ناهمگام که اگر برنامه از حالت نمایان خارج شود، نیازی به ماندگاری ندارند. | روالهای مشترک ابزار استاندارد برای خروج از رشته اصلی در Kotlin هستند. اما بهمحض بسته شدن برنامه، این فعالیتها متوقف میشوند. برای کارهایی که باید حتی پساز بسته شدن برنامه ادامه یابند، از WorkManager استفاده کنید. |
| AlarmManager | فقط زنگ ساعت. | برخلاف کارگران معمولی WorkManager، هشدارهای دقیق AlarmManager دستگاه را از حالت «چرت زدن» بیدار میکنند. بنابراین، ازنظر مدیریت منابع و مصرف برق کارآمد نیست. فقط برای زنگهای ساعت یا اعلانهای دقیق مثل رویدادهای تقویم از آن استفاده کنید، نه برای کارهای تکرارشونده پسزمینه. |
جایگزین کردن میاناهای برنامهسازی کاربردی منسوخشده
WorkManager API جایگزین توصیهشده برای میاناهای برنامهسازی کاربردی زمانبندی پسزمینه Android قبلی است، ازجمله FirebaseJobDispatcher و GcmNetworkManager.
شروع کنید
برای شروع استفاده از WorkManager در برنامهتان، راهنمای آغاز به کار را بررسی کنید.
منابع بیشتر
بخشهای زیر منابع تکمیلی ارائه میدهند.
ویدیوها
- Workmanager - MAD Skills، مجموعه ویدیو
- کار کردن با WorkManager، از «نشست توسعهدهندگان Android» در سال ۲۰۱۸
- WorkManager: Beyond the basics، از «نشست توسعهدهندگان Android» سال ۲۰۱۹