יותר מדי אירועי wakeup

הוצאות ממצב שינה הן מנגנון ב-API של AlarmManager שמאפשר למפתחים להגדיר משימה מתוזמנת שתעיר את המכשיר בשעה מסוימת. האפליקציה מגדירה שעון מעורר על ידי קריאה לאחת מהשיטות set() ב-AlarmManager עם הדיווח RTC_WAKEUP או ELAPSED_REALTIME_WAKEUP. כשמופעלת התראה להשכמה, המכשיר יוצא ממצב צריכת חשמל נמוכה ומחזיק נעילת השכמה חלקית בזמן שהוא מבצע את השיטה של ההתראה onReceive() או onAlarm(). אם אזעקות ההתעוררות מופעלות יותר מדי פעמים, הן עלולות לרוקן את הסוללה של המכשיר.

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

פתרון הבעיה

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

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

  • מחפשים קריאות לשיטות השונות של set() ב-AlarmManager שכוללות את הדגל RTC_WAKEUP או את הדגל ELAPSED_REALTIME_WAKEUP.

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

    • אל תכללו פרטים אישיים מזהים (PII) בשם, כמו כתובת אימייל. אחרת, ביומני המכשיר יופיע _UNKNOWN במקום שם ההתראה.
    • אל תקבלו את שם המחלקה או השיטה באופן פרוגרמטי, למשל על ידי קריאה ל-getName(), כי יכול להיות ש-Proguard יטשטש אותו. במקום זאת, צריך להשתמש במחרוזת שמוגדרת בהארדקוד.
    • אל תוסיפו מונה או מזהים ייחודיים לתגי התראות. המערכת לא תוכל לצבור את האזעקות שהוגדרו כך, כי לכל אחת מהן יש מזהה ייחודי.

אחרי שמתקנים את הבעיה, מריצים את פקודת ADB הבאה כדי לוודא שהתראות ההתעוררות פועלות כמצופה:

adb shell dumpsys alarm

הפקודה הזו מספקת מידע על הסטטוס של שירות מערכת האזעקה במכשיר. מידע נוסף זמין במאמר בנושא dumpsys.

שיטות מומלצות

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

אל תשתמשו ב-AlarmManager כדי לתזמן משימות ברקע, במיוחד משימות חוזרות או משימות ברקע שקשורות לרשת. מומלץ להשתמש ב-WorkManager כדי לתזמן משימות ברקע, כי הוא מציע את היתרונות הבאים:

  • איגוד לפעולות (batching) – המשימות משולבות כדי להפחית את צריכת הסוללה
  • התמדה – אם המכשיר מופעל מחדש, משימות WorkManager מתוזמנות לפעולה אחרי שההפעלה מחדש מסתיימת
  • קריטריונים – אפשר להפעיל משימות על סמך תנאים, כמו אם המכשיר נטען או אם יש חיבור Wi-Fi

מידע נוסף זמין במאמר בנושא מדריך לעיבוד ברקע.

אל תשתמשו ב-AlarmManager כדי לתזמן פעולות שקשורות לתזמון, שתקפות רק בזמן שהאפליקציה פועלת (במילים אחרות, הפעולה שקשורה לתזמון צריכה להתבטל כשהמשתמש יוצא מהאפליקציה). במקרים כאלה, עדיף להשתמש במחלקה Handler כי היא קלה יותר לשימוש ויעילה הרבה יותר.