תזמון משימות באמצעות WorkManager   חלק מ-Android Jetpack.

WorkManager הוא הפתרון המומלץ לעבודה מתמשכת. העבודה נמשכת גם אחרי הפעלות מחדש של האפליקציה והפעלות מחדש של המערכת. רוב העיבוד ברקע מתבצע בצורה הטובה ביותר באמצעות משימות מתמשכות, ולכן WorkManager הוא ה-API המומלץ העיקרי לעיבוד ברקע.

סוגי עבודה מתמשכת

‏WorkManager מטפל בשלושה סוגים של משימות מתמשכות:

  • מיידי: משימות שצריך להתחיל מיד ולהשלים בקרוב. יכול להיות שהטיפול יהיה מהיר יותר.
  • Long Running: משימות שעשויות להימשך זמן רב יותר, אולי יותר מ-10 דקות.
  • ניתנות לדחייה: משימות מתוזמנות שמתחילות במועד מאוחר יותר ויכולות לפעול באופן קבוע.

באיור 1 מוסבר איך הסוגים השונים של עבודה מתמשכת קשורים זה לזה.

משימות מתמשכות יכולות להיות מיידיות, ממושכות או ניתנות לדחייה
איור 1: סוגי עבודה מתמשכת.

באופן דומה, בטבלה הבאה מפורטים הסוגים השונים של עבודות.

סוג השידור תדירות איך ניגשים
מיידי פעם אחת OneTimeWorkRequest וגם Worker

לטיפול מהיר יותר, אפשר להתקשר למספר setExpedited() ב-OneTimeWorkRequest.

Long Running חד-פעמית או תקופתית כל ערך של WorkRequest או Worker. קוראים ל-setForeground() ב-Worker כדי לטפל בהתראה.
ניתן לדחות חד-פעמית או תקופתית PeriodicWorkRequest וגם Worker

מידע נוסף על הגדרת WorkManager זמין במדריך הגדרת בקשות Work.

תכונות

בנוסף לממשק API פשוט ועקבי יותר, ל-WorkManager יש כמה יתרונות מרכזיים נוספים:

אילוצים בעבודה

הגדרה אופרטיבית של התנאים האופטימליים להרצת העבודה באמצעות אילוצים על עבודה. לדוגמה, אפשר להפעיל את השירות רק כשהמכשיר מחובר לרשת ללא חיוב לפי שימוש, כשהמכשיר לא פעיל או כשיש מספיק טעינה בסוללה.

תזמון יעיל

באמצעות WorkManager אפשר לתזמן משימות כך שיפעלו פעם אחת או באופן חוזר באמצעות חלונות תזמון גמישים. אפשר גם לתייג ולתת שמות לעבודות, כדי לתזמן עבודות ייחודיות שאפשר להחליף, ולעקוב אחרי קבוצות של עבודות או לבטל אותן ביחד.

משימות מתוזמנות מאוחסנות במסד נתונים של SQLite שמנוהל באופן פנימי, ו-WorkManager מוודא שהמשימות האלה נשמרות ומתוזמנות מחדש אחרי הפעלות מחדש של המכשיר.

בנוסף, WorkManager פועל בהתאם לשיטות מומלצות ולתכונות לחיסכון באנרגיה, כמו מצב שינה, כך שאתם לא צריכים לדאוג.

עבודה מהירה

אפשר להשתמש ב-WorkManager כדי לתזמן משימות מיידיות לביצוע ברקע. כדאי להשתמש בעבודה מהירה למשימות שחשובות למשתמש וניתן להשלים אותן תוך כמה דקות.

מדיניות גמישה של ניסיונות חוזרים

לפעמים העבודה נכשלת. ב-WorkManager יש מדיניות גמישה של ניסיונות חוזרים, כולל מדיניות השהיה מעריכית שניתן להגדיר.

קישור משימות

לעבודות מורכבות שקשורות זו לזו, אפשר לקשר יחד משימות עבודה נפרדות באמצעות ממשק אינטואיטיבי שמאפשר לקבוע אילו משימות יפעלו ברצף ואילו יפעלו במקביל.

Kotlin


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)
        }
    )

Java


WorkManager.getInstance(...)
.beginWith(Arrays.asList(workA, workB))
.then(workC)
.enqueue();

לכל משימה בעבודה אפשר להגדיר נתוני קלט ופלט. כשמקשרים משימות, מערכת WorkManager מעבירה באופן אוטומטי את נתוני הפלט ממשימת עבודה אחת למשימה הבאה.

יכולת פעולה הדדית מובנית של שרשור

‏WorkManager משתלב בצורה חלקה עם Coroutines ו-RxJava, ומספק את הגמישות הנדרשת כדי לשלב ממשקי API אסינכררוניים משלכם.

שימוש ב-WorkManager לביצוע משימות בצורה מהימנה

WorkManager מיועד לעבודה שצריכה להימשך באופן מהימן גם אם המשתמש יוצא מהמסך, האפליקציה יוצאת או המכשיר מופעל מחדש. לדוגמה:

  • שליחת יומנים או ניתוח נתונים לשירותים לקצה העורפי.
  • סנכרון תקופתי של נתוני האפליקציה עם שרת.

WorkManager לא מיועד לעבודה ברקע בתהליך שאפשר לסיים אותה בבטחה אם תהליך האפליקציה מסתיים. הוא גם לא פתרון כללי לכל העבודה שדורשת ביצוע מיידי. מומלץ לעיין במדריך לעיבוד ברקע כדי לבדוק איזה פתרון מתאים לצרכים שלכם.

הקשר לממשקי API אחרים

פונקציות רפיטיביות הן הפתרון המומלץ לתרחישי שימוש מסוימים, אבל לא כדאי להשתמש בהן לעבודה מתמשכת. חשוב לציין ש-coroutines היא מסגרת למימוש בו-זמניות, ואילו WorkManager היא ספרייה לעבודה מתמשכת. באופן דומה, צריך להשתמש ב-AlarmManager לשעונים או ליומני אירועים בלבד.

API מומלץ ל הקשר ל-WorkManager
פונקציות רפיטיביות כל עבודה אסינכררונית שלא צריכה להיות מתמשכת. קורוטינים הם הדרך הרגילה לעזוב את ה-thread הראשי ב-Kotlin. עם זאת, הם יוצאים מהזיכרון כשהאפליקציה נסגרת. לעבודה מתמשכת, השתמשו ב-WorkManager.
AlarmManager התראות בלבד. בניגוד ל-WorkManager, ‏AlarmManager מעיר את המכשיר ממצב נמנום. לכן, היא לא יעילה מבחינת ניהול צריכת החשמל והמשאבים. מומלץ להשתמש בו רק להתרעות או להתראות מדויקות, כמו אירועים ביומן – ולא לעבודה ברקע.

החלפת ממשקי API שהוצאו משימוש

WorkManager API הוא החלופה המומלצת לכל ממשקי ה-API הקודמים של תזמון ברקע ב-Android, כולל FirebaseJobDispatcher,‏ GcmNetworkManager ו-Job Scheduler.

תחילת העבודה

כדי להתחיל להשתמש ב-WorkManager באפליקציה, כדאי לעיין במדריך לתחילת העבודה.

מקורות מידע נוספים

מידע נוסף על WorkManager זמין במקורות המידע הבאים.

דוגמיות

סרטונים

בלוגים