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