במסמך הזה מוסבר איך להעביר אפליקציות לשימוש בספריית הלקוח של WorkManager כדי לבצע פעולות ברקע במקום באמצעות ספריית GCMNetworkManager. הדרך המועדפת לתזמון משימות ברקע היא להשתמש ב-WorkManager. על ידי כולל גם את ספריית WorkManager GCM, אפשר לאפשר ל-WorkManager להשתמש GCM כדי לתזמן את המשימות בעת הרצה במכשירי Android עם רמת API 22 או פחות.
העברה אל WorkManager
אם האפליקציה שלך משתמשת כרגע ב-GCMNetworkManager כדי לבצע פעולות ברקע, יש לבצע את השלבים הבאים כדי לעבור אל WorkManager.
בשלבים הבאים, אנחנו מניחים שאתם מתחילים עם קוד GCMNetworkManager, שמגדיר ומתזמנ את המשימה שלך:
Kotlin
val myTask = OneoffTask.Builder() // setService() says what class does the work .setService(MyUploadService::class.java) // Don't run the task unless device is charging .setRequiresCharging(true) // Run the task between 5 & 15 minutes from now .setExecutionWindow(5 * DateUtil.MINUTE_IN_SECONDS, 15 * DateUtil.MINUTE_IN_SECONDS) // Define a unique tag for the task .setTag("test-upload") // ...finally, build the task and assign its value to myTask .build() GcmNetworkManager.getInstance(this).schedule(myTask)
Java
// In GcmNetworkManager, this call defines the task and its // runtime constraints: OneoffTask myTask = new OneoffTask.Builder() // setService() says what class does the work .setService(MyUploadService.class) // Don't run the task unless device is charging .setRequiresCharging(true) // Run the task between 5 & 15 minutes from now .setExecutionWindow( 5 * DateUtil.MINUTE_IN_SECONDS, 15 * DateUtil.MINUTE_IN_SECONDS) // Define a unique tag for the task .setTag("test-upload") // ...finally, build the task and assign its value to myTask .build(); GcmNetworkManager.getInstance(this).schedule(myTask);
בדוגמה הזו, אנחנו מניחים שפעולת ההעלאה בפועל מוגדרת על ידי MyUploadService
:
Kotlin
class MyUploadService : GcmTaskService() { fun onRunTask(params: TaskParams): Int { // Do some upload work return GcmNetworkManager.RESULT_SUCCESS } }
Java
class MyUploadService extends GcmTaskService { @Override public int onRunTask(TaskParams params) { // Do some upload work return GcmNetworkManager.RESULT_SUCCESS; } }
הכללה של ספריות WorkManager
כדי להשתמש בכיתות של WorkManager, צריך להוסיף את הספרייה של WorkManager וליצור יחסי תלות. צריך להוסיף גם את ספריית WorkManager GCM, מאפשר ל-WorkManager להשתמש ב-GCM לתזמון משימות כשהאפליקציה שלך פועלת מכשירים שלא תומכים ב-JobScheduler (כלומר, מכשירים עם רמת API 22) או פחות). לקבלת פרטים מלאים על הוספת הספריות, ראו תחילת העבודה עם WorkManager.
שינוי המניפסט
כשהטמעת את GCMNetworkManager, הוספת מופע של
GcmTaskService
בקובץ המניפסט של האפליקציה, כפי שמתואר בGcmNetworkManager
מסמכי עזר.
GcmTaskService
בודק את המשימה הנכנסת ומעניק אותה למשימה
המטפל. ב-WorkManager מנהל את הקצאת המשימות ל-Worker, כך שכבר לא
צריכים מחלקה שעושה את זה, פשוט מסירים את GcmTaskService
.
הגדרת ה-Worker
ההטמעה של GCMNetworkManager מגדירה את OneoffTask
או RecurringTask
,
שמציין בדיוק מה צריך לעשות. צריך לשכתב את הקוד,
Worker
, כפי שמתועד בהגדרת היצירה שלך
בקשות.
דוגמה ל-GCMNetworkManager
קוד
מגדיר משימה מסוג myTask
. המקבילה ב-WorkManager נראית כך:
Kotlin
class UploadWorker(context: Context, params: WorkerParameters) : Worker(context, params) { override fun doWork() : Result { // Do the upload operation ... myUploadOperation() // Indicate whether the task finished successfully with the Result return Result.success() } }
Java
public class UploadWorker extends Worker { public UploadWorker( @NonNull Context context, @NonNull WorkerParameters params) { super(context, params); } @Override public Result doWork() { // Do the upload operation ... myUploadOperation() // Indicate whether the task finished successfully with the Result return Result.success() } }
יש מספר הבדלים בין משימת GCM לבין Worker
:
- GCM משתמש באובייקט
TaskParams
כדי להעביר פרמטרים למשימה.WorkManager
משתמש בנתוני קלט, שניתן לציין ב-WorkRequest
, שמתוארים במשאבי העזרה שלWorkManager
לגבי הגדרת קלט/פלט את המשימה. בשני המקרים, תוכלו להעביר צמדי מפתח/ערך שמציינים כל את הפרמטרים הנדרשים לביצוע המשימה. - הערך
GcmTaskService
מציין הצלחה או כישלון על ידי החזרת סימונים כמוGcmNetworkManager.RESULT_SUCCESS
.Worker
של WorkManager מסמן את התוצאות שלו באמצעות שימושListenableWorker.Result
method, כמוListenableWorker.Result.success()
, והחזרת הערך המוחזר של אותה שיטה. - כפי שציינו, אתם לא מגדירים את האילוצים או את התגים כאשר אתם מגדירים
Worker
; במקום זאת, צריך לעשות את זה בשלב הבא, כשתיצרו אתWorkRequest
.
תזמון בקשת העבודה
הגדרת Worker
מציינת מה צריך לעשות. כדי לציין מתי היצירה
צריך להגדיר
WorkRequest
:
- יצירת
OneTimeWorkRequest
אוPeriodicWorkRequest
, וגם להגדיר את המגבלות הרצויות שמציינות מתי המשימה צריכה לפעול, וגם תגים לזיהוי העבודה שלך. - העברת הבקשה אל
WorkManager.enqueue()
כדי שהמשימה תהיה בתור לביצוע.
לדוגמה, בקטע הקודם ראינו איך להמיר
OneoffTask
לערך שווה ערך של Worker
. עם זאת, Worker
לא כלל
אילוצי הביצוע והתג של האובייקט OneoffTask
. במקום זאת, אנחנו מגדירים את
אילוצים ומזהה משימה כשאנחנו יוצרים את WorkRequest
. נציין גם
אסור שהמשימה תפעל אלא אם יש חיבור לרשת. לא צריך
לבקש באופן מפורש חיבור לרשת עם GCMNetworkManager,
כברירת מחדל, ל-GCMNetworkManager נדרש חיבור לרשת, אבל WorkManager דורש חיבור לרשת.
לא דורשים חיבור לרשת, אלא אם מוסיפים את האילוץ הזה באופן ספציפי.
אחרי שנגדיר את ה-WorkRequest
, אנחנו נוסיף אותו לתור אצל WorkManager.
Kotlin
val uploadConstraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .setRequiresCharging(true).build() val uploadTask = OneTimeWorkRequestBuilder<UploadWorker>() .setConstraints(uploadConstraints) .build() WorkManager.getInstance().enqueue(uploadTask)
Java
Constraints uploadConstraints = new Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .setRequiresCharging(true) .build(); OneTimeWorkRequest uploadTask = new OneTimeWorkRequest.Builder(UploadWorker.class) .setConstraints(uploadConstraints) .build(); WorkManager.getInstance().enqueue(uploadTask);
מיפויים של API
בקטע הזה מתואר האופן שבו חלק מהתכונות והאילוצים של GCMNetworkManager ממפים אל שווי ערך ב-WorkManager.
מיפויי מגבלות
GCMNetworkManager מאפשר להגדיר מספר אילוצים הקובעים מתי המשימה צריכה לרוץ. ברוב המקרים יש אילוץ ברור ב-WorkManager. הזה מפרטת את המקבילים האלה.
מגדירים מגבלות במשימות של GCMNetworkManager באמצעות קריאה לשיטה המתאימה
אובייקט ה-builder של המשימה. לדוגמה, אפשר להגדיר דרישת רשת כך
התקשרות אל Task.Builder.setRequiredNetwork()
.
ב-WorkManager,
אובייקט Constraints.Builder
ו
קוראים ל-methods של האובייקט כדי להגדיר מגבלות (לדוגמה,
Constraints.Builder.setRequiredNetworkType())
,
להשתמש ב-Builder כדי ליצור אובייקט Constraints (אילוצים), שניתן לצרף
בקשת עבודה. מידע נוסף זמין במאמר הגדרת היצירה שלך
בקשות.
אילוץ של GCMNetworkManager | שווה ערך ב-WorkManager | הערות |
---|---|---|
setPersisted() |
(לא חובה) | כל המשימות ב-WorkManager נשמרות בכל ההפעלות מחדש של המכשיר |
setRequiredNetwork() |
setRequiredNetworkType() |
כברירת מחדל, ל-GCMNetworkManager נדרשת גישה לרשת. כברירת מחדל, WorkManager לא מחייב גישה לרשת. אם למשימה נדרשת גישה לרשת, צריך להשתמש ב-setRequiredNetworkType(CONNECTED) או להגדיר סוג רשת ספציפי יותר. |
setRequiresCharging() |
מיפויים אחרים
מלבד אילוצים, יש הגדרות נוספות שניתן להחיל על GCMNetworkManager למשימות סיווג. בקטע הזה מוצגת הדרך המתאימה להחיל את ההגדרות על משימת WorkManager.
תגים
כל המשימות של GCMNetworkManager חייבות לכלול מחרוזת תג, שאותה ניתן להגדיר באמצעות קריאה
setTag()
של ה-builder
. משימות WorkManager מזוהות באופן ייחודי באמצעות מזהה,
נוצר באופן אוטומטי על ידי WorkManager. אפשר לקבל את התעודה המזהה
WorkRequest.getId()
לחשבון
בנוסף, בקשות עבודה יכולות לכלול אופציונלי תג אחד או יותר. כדי להגדיר תג עבור
ב-WorkManager,
WorkRequest.Builder.addTag()
, לפני שמשתמשים ב-builder הזה כדי ליצור את WorkRequest
.
ב-GCMNetworkManager ניתן לבצע קריאה
setUpdateCurrent()
כדי לציין אם המשימה צריכה להחליף כל משימה קיימת באותו תג.
הגישה המקבילה ב-WorkManager היא להוסיף למשימה לתור באמצעות קריאה
enqueueUniqueWork()
או enqueueUniquePeriodicWork()
;
אם משתמשים בשיטות האלה, נותנים למשימה שם ייחודי, וגם מציינים
מנהל העבודה צריך לטפל בבקשה אם כבר יש משימה בהמתנה עם ההגדרה
שם. למידע נוסף, ראו טיפול
העבודה.
פרמטרים של משימה
ניתן להעביר פרמטרים למשימת GCMNetworkManager באמצעות קריאה
Task.Builder.setExtras()
ונעביר ערך של Bundle
שמכיל את הפרמטרים. WorkManager מאפשר לך להעביר
אובייקט Data
למשימה של WorkManager, שמכיל את הפרמטרים בתור מפתח/ערך
זוגות של מילים. פרטים נוספים זמינים במאמר
הקצאת נתוני קלט.