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