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

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

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

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

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

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