עבודה מתמשכת   חלק מ-Android Jetpack.

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

סוגים של עבודות מתמשכות

‫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 היא ספרייה לעבודה מתמשכת. באופן דומה, כדאי להשתמש ב-AlarmManager רק לשעונים או ליומנים.

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

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

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

שנתחיל?

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

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

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

סרטונים

בלוגים

טעימות