אופטימיזציה של השימוש בסוללה עבור ממשקי API לתזמון משימות

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

תואמים.

בחירת אילוצים אופטימליים ושילוב משימות

כדי לצמצם את העומס שהמשימות יוצרות על המכשיר, חשוב להגדיר אילוצים אופטימליים. (לגבי משימות JobScheduler, רשימת המגבלות מופיעה במאמר JobInfo.Builder). לדוגמה, אם רוצים לוודא שהאפליקציה לא תרוקן את הסוללה, מומלץ לציין את האילוץ RequiresCharging. המגבלה הזו אומרת למערכת לא להריץ את העבודה אלא אם רמת הסוללה עולה בפועל. באופן דומה, שימוש ב-Wi-Fi בדרך כלל דורש פחות חשמל מאשר שימוש בחבילת גלישה. לכן, אם המשימה שלכם דורשת חיבור לרשת אבל יכולה לחכות עד שרשת ללא הגבלה תהיה זמינה, מומלץ להגדיר מגבלה של NetworkType.UNMETERED.

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

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

כדאי לסמן משימות כדחופות רק אם הן רגישות לזמן

אם משימה דחופה במיוחד, אפשר לסמן אותה כדחופה. (למשימות של JobScheduler, צריך להתקשר אל JobInfo.Builder.setExpedited(true).) פעולה כזו נותנת עדיפות למשימה בכמה דרכים. לדוגמה, המערכת מריצה את המשימות האלה מיד כשהיא יכולה, והגבלות של ניהול צריכת החשמל לא צפויות להשפיע על משימות שמוגדרות כדחופות.

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

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

למה המשימות נעצרו

אם המשימות שלכם נעצרות לפני שהן מסתיימות, אתם יכולים לבדוק למה הן נעצרו על ידי קריאה ל-WorkInfo.getStopReason(). (במשימות של JobScheduler, צריך להתקשר אל JobParameters.getStopReason() חשוב לעשות את זה מכמה סיבות. קודם כול, ברור שאתם רוצים שהמשימות יסתיימו. הבנה למה המשימות שלכם נעצרו עוזרת לכם להימנע ממצבים דומים. אבל בנוסף, סביר שהמערכת תפסיק משימות בגלל התנהגות שגורמת לשימוש יתר במשאבי המערכת. אתם לא רוצים שהאפליקציה שלכם תהיה 'אזרח רע' ותשתמש בסוללה או ברשת שלא לצורך.

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

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