תזמון משימות

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

סוגי תוכן

‫WorkManager מטפל בשלושה סוגי עבודה:

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

באיור 1 מוצגות הקשרים בין סוגי המשימות השונים.

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

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

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

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

תכונות של WorkManager

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

מגבלות בעבודה

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

תזמון מתקדם

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

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

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

משימה דחופה

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

מדיניות גמישה בנושא ניסיון חוזר

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

Work chaining

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

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 אחרים

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

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

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

ה-WorkManager API הוא תחליף מומלץ לממשקי API קודמים לתזמון ברקע ב-Android, כולל FirebaseJobDispatcher ו-GcmNetworkManager.

שנתחיל?

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

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

בקטעים הבאים ריכזנו כמה מקורות מידע נוספים.

סרטונים

בלוגים

טעימות