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

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

השפעת חיי הסוללה של ביצוע עדכוני אפליקציה תלויה ברמת הטעינה של הסוללה במצב הטעינה של המכשיר. ההשפעה של ביצוע עדכונים בזמן שהמכשיר נטען באמצעות 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 בתוך מסנן Intent.

<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>

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

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

אפשר לראות את רמת הטעינה הנוכחית של הסוללה על ידי חילוץ רמת הטעינה הנוכחית של הסוללה וקנה מידה מתוך Intent של סטטוס הסוללה כפי שמוצג כאן:

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 אילוצים).

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