ב-Android יש שתי תכונות לחיסכון באנרגיה שמאריכות את חיי הסוללה למשתמשים, באמצעות ניהול אופן הפעולה של האפליקציות כשהמכשיר לא מחובר לספק כוח: 'נמנום' ו'מצב המתנה'. התכונה Doze מפחיתה את צריכת הסוללה על ידי דחיית הפעילות של מעבד ה-CPU והפעילות ברשת של האפליקציות ברקע, כשלא משתמשים במכשיר במשך פרקי זמן ארוכים. המתנה של אפליקציה דוחה את הפעילות ברשת ברקע לגבי אפליקציות שלא הייתה בהן פעילות לאחרונה של המשתמשים.
בזמן שהמכשיר במצב 'נמנום', הגישה של אפליקציות למשאבים מסוימים שצורכים הרבה סוללה נדחית עד לחלון התחזוקה. ההגבלות הספציפיות מפורטות במאמר הגבלות על ניהול צריכת חשמל.
מצב 'נמנום' ו'מצב המתנה' מנהלים את ההתנהגות של כל האפליקציות שפועלות ב-Android מגרסה 6.0 ואילך, גם אם הן מטרגטות באופן ספציפי את רמת ה-API 23 ולא משנה אם הן מטרגטות באופן ספציפי את רמת ה-API 23. כדי להבטיח את החוויה הטובה ביותר למשתמשים, כדאי לבדוק את האפליקציה במצב 'נמנום' ובמצב 'בהמתנה' של האפליקציה ולבצע את השינויים הדרושים בקוד. בקטעים הבאים מופיעים פרטים.
הסבר על נמנום
אם המשתמש משאיר מכשיר מנותק מהחשמל ונייח לפרק זמן מסוים, כשהמסך כבוי, המכשיר עובר למצב 'נמנום'. במצב Doze, המערכת מנסה לחסוך בסוללה על ידי הגבלת הגישה של האפליקציות לרשת ולשירותים שמנצלים הרבה משאבי מעבד. הוא גם מונע מאפליקציות גישה לרשת ודוחה את המשימות, הסנכרונים וההתראות הרגילות שלהן.
מדי פעם המערכת יוצאת ממצב Doze למשך זמן קצר כדי לאפשר לאפליקציות להשלים את הפעילויות שהועברו. במהלך חלון התחזוקה הזה, המערכת מפעילה את כל הסנכרונים, המשימות וההתראות שבהמתנה, ומאפשרת לאפליקציות לגשת לרשת.
כשחלון התחזוקה מסתיים, המערכת שוב נכנסה ל'נמנום', משמיטה את הגישה לרשת ודוחה משימות, סנכרונים והתראות. עם הזמן, המערכת מתזמנת את חלונות התחזוקה בתדירות נמוכה יותר, וכך עוזרת לצמצם את צריכת הסוללה במקרים של חוסר פעילות למשך זמן ארוך יותר כשהמכשיר לא בטעינה.
כשהמשתמש מוציא את המכשיר ממצב שינה על ידי הזזה, הפעלת המסך או חיבור מטען, המערכת יוצאת מ'נמנום' וכל האפליקציות ממשיכות את הפעילות הרגילה.
הגבלות על נמנום
המערכת מחילה את ההגבלות הבאות על האפליקציות בזמן שהמכשיר במצב שינה:
- השעיית הגישה לרשת.
- התעלמות מחסימות מצב שינה.
- דחיית ההתראות הסטנדרטיות של
AlarmManager
, כוללsetExact()
ו-setWindow()
, לחלון התחזוק הבא.- אם צריך להגדיר התראות שמופעלות במצב 'נמנום', אפשר להשתמש
ב-
setAndAllowWhileIdle()
או ב-setExactAndAllowWhileIdle()
. - התראות שהוגדרו עם
setAlarmClock()
ימשיכו לפעול כרגיל. המערכת תצא ממצב Doze זמן קצר לפני שההתראות האלה יופעלו.
- אם צריך להגדיר התראות שמופעלות במצב 'נמנום', אפשר להשתמש
ב-
- לא מתבצע חיפוש של נקודות Wi-Fi.
- לא מאפשר למתאמי סנכרון לפעול.
- לא מאפשר ל-
JobScheduler
לפעול.
רשימת משימות בנושא נמנום
- אם אפשר, כדאי להשתמש בהעברת הודעות בענן ב-Firebase (FCM) להעברת הודעות במורד הזרם.
- אם המשתמשים חייבים לראות התראה מיד, אפשר להשתמש ב הודעה בעדיפות גבוהה של FCM. כדאי להשתמש בעדיפות גבוהה רק להודעות שמתקבלת עליהן התראה. למידע נוסף, אפשר לעיין במסמכי התיעוד של FCM בנושא עדיפות של הודעות ב-Android.
- צריך לספק מספיק מידע במטען הייעודי (payload) של ההודעה הראשוני, כך שאין צורך בגישה לרשת לאחר מכן.
- מגדירים התראות קריטיות באמצעות
setAndAllowWhileIdle()
ו-setExactAndAllowWhileIdle()
. - בודקים את האפליקציה ב-Doze.
התאמת האפליקציה ל-Doze
האפשרות 'נמנום' יכולה להשפיע על אפליקציות בצורה שונה, בהתאם ליכולות שהם מציעים ולשירותים שבהם הן משתמשות. הרבה אפליקציות פועלות כרגיל במהלך מחזורי Doze בלי שינוי. במקרים מסוימים צריך לשפר את האופן שבו האפליקציה מנהלת את הרשת, ההתראות, המשימות והסנכרון. לאפליקציות צריכה להיות אפשרות לנהל פעילויות ביעילות במהלך כל חלון תחזוקה.
כדי לתזמן התראות, אפשר להשתמש בשתי שיטות של AlarmManager
: setAndAllowWhileIdle()
ו-setExactAndAllowWhileIdle()
. בעזרת השיטות האלה תוכלו להגדיר התראות שיופעלו גם אם המכשיר נמצא במצב שינה.
גם הגבלת הגישה לרשת עשויה להשפיע על האפליקציה, במיוחד אם האפליקציה מסתמכת על הודעות בזמן אמת, כמו טריגרים או התראות. אם האפליקציה שלכם דורשת חיבור קבוע לרשת כדי לקבל הודעות, כדאי להשתמש בהעברת הודעות בענן ב-Firebase (FCM), אם אפשר.
כדי לוודא שהאפליקציה פועלת כצפוי, אפשר להשתמש בפקודות adb
כדי לאלץ את המערכת להיכנס ל-Doze ולצאת ממנה ותצפית על התנהגות האפליקציה. למידע נוסף, ראו בדיקה באמצעות Doze ו-App Standby.
הסבר על מצב המתנה של אפליקציה
המצב 'המתנה לאפליקציה' מאפשר למערכת לקבוע שאפליקציה נמצאת במצב המתנה כשהמשתמש לא משתמש בה באופן פעיל. המערכת קובעת זאת כשהמשתמש לא נוגע באפליקציה במשך פרק זמן מסוים, ואף אחד מהתנאים הבאים לא מתקיים:
- המשתמש מפעיל באופן מפורש את האפליקציה.
- לאפליקציה יש תהליך שנמצא כרגע בחזית, כפעילות או כשירות בחזית, או שפועלת בו פעילות או שירות אחר בחזית.
- האפליקציה יוצרת התראה שהמשתמשים רואים במסך הנעילה או במגש ההתראות.
כשהמשתמש מחבר את המכשיר למקור חשמל, המערכת משחררת את האפליקציות ממצב המתנה, ומאפשרת להן לגשת לרשת ולבצע משימות וסנכרון בהמתנה. אם המכשיר לא פעיל במשך תקופות ארוכות, המערכת מאפשרת לאפליקציות לא פעילות גישה לרשת בערך פעם ביום.
שימוש ב-FCM כדי לקיים אינטראקציה עם האפליקציה כשהמכשיר לא פעיל
Firebase Cloud Messaging (FCM) הוא שירות ענן-מכשיר שמאפשר לתמוך בהעברת הודעות בזמן אמת בין שירותים לקצה העורפי לאפליקציות במכשירי Android. FCM מספק חיבור אחד ועקבי לענן. החיבור הזה יכול לשתף את החיבור בין כל האפליקציות שדורשות העברת הודעות בזמן אמת. החיבור המשותף הזה מייעל באופן משמעותי את צריכת הסוללה. לשם כך לא צריך יותר אפליקציות כדי לשמור על חיבורים נפרדים ועקביים בנפרד, מה שיכול לרוקן את הסוללה במהירות. לכן, אם באפליקציה שלכם יש צורך בשילוב של הודעות עם שירות לקצה העורפי, מומלץ מאוד להשתמש ב-FCM אם אפשר, במקום לשמור על חיבור רשת מתמיד משלכם.
ה-FCM עבר אופטימיזציה לעבודה עם מצבי ההשבתה Doze ו-App Standby. הודעות בעדיפות גבוהה של FCM מאפשרות להוציא את האפליקציה ממצב שינה כדי ליצור אינטראקציה עם המשתמש. במצב Doze או במצב המתנה של האפליקציה, המערכת מעבירה את ההודעה ומעניקה לאפליקציה גישה זמנית לשירותי הרשת ולנעילות חלקיות, ולאחר מכן מחזירה את המכשיר או האפליקציה למצב מנוחה. כדאי להשתמש בהודעות עם עדיפות גבוהה כדי להעביר אותן במצב 'נמנום', כשמדובר בהתראות תלויות-זמן ובהודעות גלויות למשתמש. הודעות עם עדיפות גבוהה עלולות לגרום לכך שתקבלו התראות. למידע נוסף, ראו ההנחיות של FCM לגבי הודעות בעדיפות גבוהה.
להודעות שלא גורמות להצגת התראות, כמו עדכון תוכן האפליקציה ברקע או הפעלת סנכרון נתונים, צריך להשתמש בהודעות FCM עם עדיפות רגילה. הודעות עם עדיפות רגילה נשלחות באופן מיידי אם המכשיר לא נמצא במצב Doze. אם המכשיר נמצא במצב Doze, ההודעות נשלחות במהלך חלונות התחזוקה הרגילים של Doze או ברגע שהמשתמש מעיר את המכשיר.
באופן כללי, אם האפליקציה שלכם דורשת העברת הודעות במורד הזרם, כדאי להשתמש ב-FCM. אם האפליקציה שלכם כבר משתמשת ב-FCM, חשוב לוודא שהיא משתמשת בהודעות בעדיפות גבוהה רק להודעות שמובילות להצגת התראות למשתמשים.
תמיכה בתרחישי שימוש אחרים
כמעט כל האפליקציות יכולות לתמוך ב-Doze על ידי ניהול קישוריות הרשת, ההתראות, המשימות והסנכרון, ושימוש בהודעות FCM. יכול להיות שלא יהיה מספיק שימוש בקבוצה מצומצמת של תרחישים לדוגמה. במקרים כאלה, המערכת מספקת רשימה ניתנת להגדרה של אפליקציות שפטורות באופן חלקי מאופטימיזציות 'נמנום' ו-'App Standby'.
אפליקציה שפטורת חלקית יכולה להשתמש ברשת ולהחזיק בחסימות חלקיות של מצב שינה במהלך 'נמנום' ו'מצב המתנה'. עם זאת, הגבלות אחרות עדיין חלות על האפליקציה, בדיוק כמו על אפליקציות אחרות. לדוגמה, המשימות והסנכרונים של האפליקציה נדחות ב-API ברמה 23 ומטה, וההתראות הרגילות של AlarmManager
לא מופעלות. אפליקציה יכולה לבדוק אם היא נמצאת כרגע ברשימת ההחרגות באמצעות קריאה ל-isIgnoringBatteryOptimizations()
.
המשתמשים יכולים להגדיר באופן ידני את רשימת האפליקציות הפטורות בקטע הגדרות > סוללה > אופטימיזציה של הסוללה. לחלופין, המערכת מספקת לאפליקציות דרכים לבקש מהמשתמשים לפטור אותן:
- רוב האפליקציות יכולות להפעיל כוונה שמכילה את הערך
ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
. - במקום זאת, אפליקציות שעומדות בתרחיש מקובל
יכולות להפעיל Intent שמכיל את
פעולת Intent מסוג
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
, כדי לאפשר למשתמש להוסיף את האפליקציה ישירות לרשימת הפטור, בלי להיכנס להגדרות המערכת.
האפליקציה יכולה לבדוק אם היא נמצאת כרגע ברשימת הפטור באמצעות חיוג למספר
isIgnoringBatteryOptimizations()
.
בדיקה עם Doze ו'אפליקציה במצב המתנה'
כדי להבטיח חוויית שימוש מעולה למשתמשים, מומלץ לבדוק את האפליקציה באופן מלא ב-Doze וב-App Standby.
בדיקת האפליקציה באמצעות Doze
ניתן לבדוק את מצב 'נמנום' על ידי ביצוע הפעולות הבאות:
- מגדירים מכשיר חומרה או מכשיר וירטואלי עם קובץ אימג' של מערכת Android בגרסה 6.0 (רמת API 23) ואילך.
- מחברים את המכשיר למכונה לפיתוח ומתקינים את האפליקציה.
- מפעילים את האפליקציה ומשאירים אותה פעילה.
- כדי לאלץ את המערכת למצב חוסר פעילות, מריצים את הפקודה הבאה:
$ adb shell dumpsys deviceidle force-idle
- כשמסיימים, יוצאים ממצב ההמתנה על ידי הפעלת הפקודה הבאה:
$ adb shell dumpsys deviceidle unforce
- מפעילים מחדש את המכשיר באמצעות הפקודה הבאה:
$ adb shell dumpsys battery reset
- חשוב לבדוק את התנהגות האפליקציה אחרי שמפעילים מחדש את המכשיר. חשוב לוודא שהאפליקציה מתאוששת בצורה חלקה כשהמכשיר יוצא ממצב Doze.
בדיקת האפליקציה באמצעות 'מצב המתנה לאפליקציות'
כדי לבדוק את מצב ההמתנה של האפליקציה באפליקציה שלכם:
- צריך להגדיר מכשיר חומרה או מכשיר וירטואלי עם Android 6.0 (רמת API 23) ואילך.
- מחברים את המכשיר למכונה לפיתוח ומתקינים את האפליקציה.
- מריצים את האפליקציה ומשאירים אותה פעילה.
- מריצים את הפקודות הבאות כדי להעביר את האפליקציה למצב המתנה של אפליקציה:
$ adb shell dumpsys battery unplug $ adb shell am set-inactive <packageName> true
- הדמיה של הוצאה ממצב שינה של האפליקציה באמצעות הפקודות הבאות:
$ adb shell am set-inactive <packageName> false $ adb shell am get-inactive <packageName>
- חשוב לבדוק את התנהגות האפליקציה אחרי שמוציאים אותה ממצב שינה. חשוב לוודא שהאפליקציה מתאווננת בצורה חלקה ממצב המתנה. חשוב במיוחד לבדוק אם ההתראות ועבודות הרקע של האפליקציה פועלות כמצופה.
תרחישים לדוגמה של שימוש מקובל לפטור
בטבלה הבאה מפורטים תרחישים לדוגמה, ומצוין אם אפליקציות יכולות להשתמש בכוונת הרכישה ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
במצבים האלה. באופן כללי, האפליקציה לא עומדת בדרישות החריגות האלה, אלא אם התכונה Doze או App Holdby קוטעת את הפונקציה העיקרית של האפליקציה, או שיש סיבה טכנית לכך שהאפליקציה לא יכולה להשתמש בהודעות בעדיפות גבוהה של FCM.
מידע נוסף זמין במאמר תמיכה בתרחישים אחרים לדוגמה.
סוג | תרחיש לדוגמה | האם אפשר להשתמש ב-FCM? | האם הפטור מקובל? | הערות |
---|---|---|---|---|
אפליקציה להעברת הודעות מיידיות, לצ'אט או לשיחות. | נדרשת מסירת הודעות בזמן אמת למשתמשים כשהמכשיר במצב 'נמנום' או שהאפליקציה נמצאת במצב המתנה. | כן, באמצעות FCM | לא קביל | שימוש בהודעות FCM עם עדיפות גבוהה כדי להעיר את האפליקציה ולגשת לרשת. |
כן, אבל הוא לא משתמש בהודעות בעדיפות גבוהה של FCM. | ||||
אפליקציות להעברת הודעות מיידיות, צ'אט או שיחות; אפליקציות VoIP לארגונים. | לא, אי אפשר להשתמש ב-FCM בגלל תלות טכנית בשירות הודעות אחר, או כי התכונות Doze ו-App Standby משבשות את הפונקציה המרכזית של האפליקציה. | מקובל | ||
אפליקציית הבטיחות. | אפליקציות ששומרות על הבטיחות של המשתמשים והמשפחה שלהם. | אם רלוונטי. | מקובל | |
אפליקציה לאוטומציה של משימות. | הפונקציה העיקרית של האפליקציה היא תזמון פעולות אוטומטיות, כמו שליחת הודעות מיידיות, שיחות קוליות או ניהול תמונות חדשות. | אם רלוונטי. | מקובל | |
אפליקציה נלווית של ציוד היקפי. | הפונקציה המרכזית של האפליקציה היא שמירה על חיבור מתמיד עם המכשיר ההיקפי, כדי לספק לו גישה לאינטרנט. | אם רלוונטי. | מקובל | |
האפליקציה צריכה להתחבר למכשיר היקפי רק מדי פעם כדי לסנכרן, או צריכה להתחבר רק למכשירים, כמו אוזניות אלחוטיות, שמחוברות באמצעות פרופילים רגילים של Bluetooth. | אם רלוונטי. | לא קביל |