שימוש ב-wake lock עלול לפגוע בביצועי המכשיר. אם אתם צריכים להשתמש ב-wake lock, חשוב לעשות זאת בצורה נכונה. במסמך הזה מפורטות כמה שיטות מומלצות שיכולות לעזור לכם להימנע מטעויות נפוצות שקשורות לנעילת השהיה.
מתן שם לחסימת מצב שינה בצורה נכונה
מומלץ לכלול את שם החבילה, המחלקה או השיטה בתג wakelock. כך, אם מתרחשת שגיאה, קל יותר למצוא את המיקום בקוד המקור שבו נוצרה חסימת מצב השינה. ריכזנו כאן עוד כמה טיפים:
- אל תכללו פרטים אישיים מזהים (PII) בשם, כמו כתובת אימייל. אם המכשיר מזהה פרטים אישיים מזהים בתג של חסימת מצב שינה, הוא מתעד
_UNKNOWNבמקום התג שציינתם. - אל תקבלו את שם המחלקה או השיטה באופן פרוגרמטי, למשל על ידי קריאה ל-
getName(). אם מנסים לקבל את השם באופן פרוגרמטי, יכול להיות שהוא יוסתר על ידי כלים כמו Proguard. במקום זאת, צריך להשתמש במחרוזת עם קידוד קשיח. - אל תוסיפו מונה או מזהים ייחודיים לתגי חסימת מצב שינה. הקוד שיוצר חסימת מצב שינה צריך להשתמש באותו תג בכל פעם שהוא מופעל. השיטה הזו מאפשרת למערכת לצבור את השימוש בכל שיטת חסימת מצב שינה.
מוודאים שהאפליקציה גלויה בחזית
בזמן ש'חסימת מצב שינה' פעילה, המכשיר צורך חשמל. המשתמש במכשיר צריך לדעת שהפעולה הזו מתבצעת. לכן, אם אתם משתמשים ב-wake lock, כדאי להציג למשתמש התראה כלשהי. בפועל, המשמעות היא שצריך לקבל את נעילת ההשכמה ולהחזיק אותה בשירות שפועל בחזית. שירותים שפועלים בחזית נדרשים להצגת הודעה.
אם שירות שפועל בחזית הוא לא הבחירה הנכונה לאפליקציה שלכם, כנראה שגם לא כדאי להשתמש בחסימת מצב שינה. במאמר בנושא בחירת ה-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();
}
}