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