שימוש בחסימת מצב שינה עלול לפגוע בביצועי המכשיר. אם אתם צריכים להשתמש בחסימת מצב שינה, חשוב לעשות את זה כמו שצריך. במסמך הזה מפורטות כמה שיטות מומלצות שיכולות לעזור לכם להימנע מבעיות נפוצות שקשורות לחסימת מצב שינה.
תנו לחסימת מצב השינה שם מתאים
מומלץ לכלול את שם החבילה, המחלקה או השיטה בתג של נעילת Wakelock. כך, אם מתרחשת שגיאה, קל יותר למצוא את המיקום בקוד המקור שבו נוצרה חסימת מצב השינה. הנה עוד כמה טיפים:
- אל תכללו בשם פרטים אישיים מזהים (PII), כמו כתובת אימייל. אם המכשיר מזהה פרטים אישיים מזהים בתג של חסימת מצב השינה, הוא מתעד את הערך
_UNKNOWNבמקום את התג שציינתם. - אל תאחזרו את שם המחלקה או השיטה באופן פרוגרמטי, למשל באמצעות קריאה ל-
getName(). אם תנסו לקבל את השם באופן פרוגרמטי, יכול להיות שכלים כמו Proguard יסתירו אותו. במקום זאת, צריך להשתמש במחרוזת בתוך הקוד. - אל תוסיפו מונה או מזהים ייחודיים לתגי חסימת מצב שינה. הקוד שיוצר חסימת מצב שינה צריך להשתמש באותו תג בכל פעם שהוא פועל. כך המערכת יכולה לצבור את השימוש בחסימת מצב שינה של כל שיטה.
מוודאים שהאפליקציה מוצגת בחזית
כשהמכשיר במצב של חסימת מצב שינה, הוא צורך חשמל. המשתמש במכשיר צריך להיות מודע לכך. לכן, אם אתם משתמשים בחסימת מצב שינה, כדאי להציג למשתמש התראה כלשהי. בפועל, זה אומר שצריך לקבל את ה-wakelock ולהחזיק בו בשירות שפועל בחזית. שירותים שפועלים בחזית נדרשים כדי להציג התראה.
אם שירות שפועל בחזית לא מתאים לאפליקציה שלכם, כנראה שגם לא כדאי להשתמש בחסימת מצב שינה. במאמר העזרה בחירת ה-API הנכון כדי למנוע את מצב השינה של המכשיר מוסבר איך לבצע פעולות כשהאפליקציה לא פועלת בחזית.
לשמור על לוגיקה פשוטה
חשוב לוודא שהלוגיקה של הפעלת חסימת מצב שינה וביטול החסימה פשוטה ככל האפשר. כשהלוגיקה של חסימת מצב השינה קשורה למכונות מצבים מורכבות, לזמנים קצובים לתפוגה, למאגרי מנהלי משימות או לאירועי קריאה חוזרת, כל באג קטן בלוגיקה הזו יכול לגרום לכך שחסימת מצב השינה תימשך יותר זמן מהצפוי. קשה לאבחן את הבאגים האלה ולנפות אותם.
מוודאים שחסימת מצב השינה תמיד מבוטלת
אם אתם משתמשים בחסימת מצב שינה, אתם צריכים לוודא שכל חסימה שאתם מפעילים משתחררת כמו שצריך. זה לא תמיד קל כמו שזה נשמע. לדוגמה, בקוד הבא יש בעיה:
Kotlin
@Throws(MyException::class)
fun doSomethingAndRelease() {
wakeLock.apply {
acquire()
doTheWork() // can potentially throw MyException
release() // does not run if an exception is thrown
}
}
Java
void doSomethingAndRelease() throws MyException {
wakeLock.acquire();
doTheWork(); // can potentially throw MyException
wakeLock.release(); // does not run if an exception is thrown
}
הבעיה כאן היא שהשיטה doTheWork() יכולה להציג את החריגה MyException. אם כן, השיטה doSomethingAndRelease() מפיצה את החריגה החוצה, והיא אף פעם לא מגיעה לקריאה release(). התוצאה היא שחסימת מצב השינה נרכשת אבל לא משוחררת, וזה מצב מאוד לא רצוי.
בקוד המתוקן, doSomethingAndRelease() מבטל את חסימת מצב השינה גם אם הייתה שגיאה:
Kotlin
@Throws(MyException::class)
fun doSomethingAndRelease() {
wakeLock.apply {
try {
acquire()
doTheWork()
} finally {
release()
}
}
}
Java
void doSomethingAndRelease() throws MyException {
try {
wakeLock.acquire();
doTheWork();
} finally {
wakeLock.release();
}
}