איך למנוע מהמכשיר להיכנס למצב שינה

כדי למנוע את התרוקנות הסוללה, מכשיר Android שלא פעיל נופל במהירות לפני השינה. עם זאת, לפעמים אפליקציה צריכה להוציא את המסך ממצב שינה או את המעבד (CPU) והשאר אותו במצב פעיל כדי לבצע עבודה.

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

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

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

  • אם האפליקציה מבצעת הורדות HTTP ממושכות, מומלץ להשתמש DownloadManager

  • אם האפליקציה שלך מסנכרנת נתונים משרת חיצוני, כדאי ליצור מתאם סנכרון.

  • אם האפליקציה מסתמכת על שירותים ברקע, כדאי להשתמש JobScheduler (מתזמן המשימות) או העברת הודעות בענן ב-Firebase כדי להפעיל את השירותים האלה במרווחי זמן ספציפיים.

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

השארת המסך פועל

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

Kotlin

class MainActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
    }
}

Java

public class MainActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  }
}

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

דרך נוספת ליישם זאת היא בקובץ ה-XML של פריסת האפליקציה, באמצעות המאפיין android:keepScreenOn:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true">
    ...
</RelativeLayout>

השימוש ב-android:keepScreenOn="true" מקביל לשימוש FLAG_KEEP_SCREEN_ON. אפשר לבחור בכל גישה שמתאימה לאפליקציה שלכם. היתרון של ההגדרה הדגל באופן פרוגרמטי בפעילות הוא שהוא נותן אפשרות ניקוי פרוגרמטי של הדגל מאוחר יותר, וכך מאפשר למסך להסתובב מושבתת.

שירות Google TV Ambient Mode בטלוויזיה

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

השארת המעבד (CPU) פועל

אם אתם צריכים שהמעבד (CPU) ימשיך לפעול כדי להשלים עבודה כלשהי לפני המכשיר עובר למצב שינה, אפשר להשתמש תכונת שירות מערכת PowerManager שנקראות 'חסימות מצב שינה'. חסימות מצב שינה מאפשרות לאפליקציה לשלוט במצב החשמל של המכשיר המארח.

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

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

כדי להשתמש בנעילה של מצב שינה, שלב ראשון הוא להוסיף את הרשאה ל-WAKE_LOCK כדי קובץ המניפסט של האפליקציה:

<uses-permission android:name="android.permission.WAKE_LOCK" />

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

Kotlin

val wakeLock: PowerManager.WakeLock =
        (getSystemService(Context.POWER_SERVICE) as PowerManager).run {
            newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag").apply {
                acquire()
            }
        }

Java

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
        "MyApp::MyWakelockTag");
wakeLock.acquire();

כדי לשחרר את התכונה 'נעילת מצב שינה', צריך להתקשר wakelock.release() הפעולה הזו מעבירה את התלונה למעבד (CPU). חשוב לשחרר את התכונה 'נעילת מצב שינה' כי ברגע שהאפליקציה מסיימת להשתמש בה, כדי למנוע את התרוקנות הסוללה.