מעקב אחר רמת הסוללה ומצב הטעינה

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

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

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

איך בודקים את מצב הטעינה הנוכחי

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

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

Kotlin

val batteryStatus: Intent? = IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { ifilter ->
    context.registerReceiver(null, ifilter)
}

Java

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);

אפשר לחלץ גם את סטטוס הטעינה הנוכחי וגם אם המכשיר בטעינה, המכשיר נטען באמצעות מטען USB או AC:

Kotlin

val status: Int = batteryStatus?.getIntExtra(BatteryManager.EXTRA_STATUS, -1) ?: -1
val isCharging: Boolean = status == BatteryManager.BATTERY_STATUS_CHARGING
        || status == BatteryManager.BATTERY_STATUS_FULL

// How are we charging?
val chargePlug: Int = batteryStatus?.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) ?: -1
val usbCharge: Boolean = chargePlug == BatteryManager.BATTERY_PLUGGED_USB
val acCharge: Boolean = chargePlug == BatteryManager.BATTERY_PLUGGED_AC

Java

// Are we charging / charged?
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                     status == BatteryManager.BATTERY_STATUS_FULL;

// How are we charging?
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;

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

מעקב אחר שינויים בסטטוס הטעינה

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

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

<receiver android:name=".PowerConnectionReceiver">
  <intent-filter>
    <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
    <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
  </intent-filter>
</receiver>

איך בודקים את רמת הטעינה הנוכחית של הסוללה

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

כדי למצוא את רמת הטעינה הנוכחית של הסוללה, אפשר לחלץ את רמת הטעינה הנוכחית של הסוללה ואת הסולם שלה מהכוונה לסטטוס הסוללה, כפי שמתואר כאן:

Kotlin

val batteryPct: Float? = batteryStatus?.let { intent ->
    val level: Int = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
    val scale: Int = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
    level * 100 / scale.toFloat()
}

Java

int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

float batteryPct = level * 100 / (float)scale;

תגובה לשינויים משמעותיים ברמת הסוללה

לא ניתן לעקוב בקלות אחר מצב הסוללה באופן קבוע, אבל אין צורך בכך.

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

מומלץ לא להפעיל את העדכונים ברקע כשהסוללה ריקה מאוד. לא משנה כמה הנתונים עדכניים, אם הטלפון נכבה לפני שאתם יכולים להשתמש בהם. כדי לעשות את זה, שימוש בספרייה של Work Manager עם אילוץ של BatteryNotLow כדי לציין שהעבודה לא צריכה לפעול אם הסוללה חלשה (בנוסף לכל NetworkType אילוצים).

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