שימוש בשיטות המומלצות לנעילה להפעלה מחדש

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

נותנים שם לחסימת מצב השינה

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

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

לוודא שהאפליקציה מוצגת בחזית

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

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

לשמור על פשטות הלוגיקה

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

בודקים שהנעילה להפעלה תמיד משוחררת

אם אתם משתמשים ב-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(). התוצאה היא שהנעילה לצורך התעוררות נרכשת אבל לא משוחררת, וזו תוצאה מאוד לא טובה.

בקוד המתוקן, 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();
    }
}