عند تغيير وتيرة التحديثات في الخلفية للحد من تأثير تلك التحديثات في عمر البطارية، من الأفضل أولاً التحقّق من مستوى شحن البطارية وحالتها.
يعتمد تأثير إجراء تحديثات التطبيقات على عمر البطارية على مستوى البطارية وحالة شحن الجهاز. إنّ تأثير إجراء التحديثات أثناء شحن الجهاز من خلال التيار المتناوب هو منخفض جدًا، لذا يمكنك في معظم الحالات زيادة معدل التحديث إلى أقصى حدّ عندما يكون الجهاز متصلاً بشاحن حائط. بالعكس، إذا كان الجهاز يفرغ شحن الجهاز، يساعد تقليل معدل التحديث في إطالة عمر البطارية.
وبالمثل، يمكنك التحقّق من مستوى شحن البطارية، ما قد يؤدي إلى تقليل وتيرة تلقّي التحديثات أو إيقافها تمامًا عندما تكون طاقة البطارية على وشك النفاد.
تحديد حالة الشحن الحالية
ابدأ بتحديد حالة تحصيل الرسوم الحالية. تعمل "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 أو شاحن التيار المتردد:
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). بدلاً من ذلك، يمكنك تقديم قيود على العمل تحدّد وقت تنفيذه،
ما يسمح للنظام باتخاذ القرار بدون إنفاق الطاقة في بدء تشغيل تطبيقك.
من الممارسات الجيدة بشكل عام عدم تشغيل التحديثات في الخلفية عندما تكون البطارية
منخفضة بشكل خطير. لا يهم مدى حداثة بياناتك إذا كان الهاتف يتم إيقافه تلقائيًا قبل أن تتمكّن من
الاستفادة منها. لإجراء ذلك،
يمكنك استخدام مكتبة WorkManager
مع فرض قيود على
BatteryNotLow
للإشارة إلى أنّه يجب عدم تنفيذ العمل في حال انخفاض طاقة البطارية (بالإضافة إلى أي قيود
NetworkType
ذات صلة).
في كثير من الحالات، يكون شحن الجهاز متزامنًا مع وضعه في قاعدة إرساء. لمزيد من المعلومات، يُرجى الاطّلاع على القسم تحديد حالة الإرساء ونوعه ورصدهما.