مراقبة مستوى البطارية وحالة الشحن

عند تغيير وتيرة التحديثات في الخلفية للحد من تأثير تلك التحديثات في عمر البطارية، من الأفضل أولاً التحقّق من مستوى شحن البطارية وحالتها.

يعتمد تأثير إجراء تحديثات التطبيقات على عمر البطارية على مستوى البطارية وحالة شحن الجهاز. إنّ تأثير إجراء التحديثات أثناء شحن الجهاز من خلال التيار المتناوب هو منخفض جدًا، لذا يمكنك في معظم الحالات زيادة معدل التحديث إلى أقصى حدّ عندما يكون الجهاز متصلاً بشاحن حائط. بالعكس، إذا كان الجهاز يفرغ شحن الجهاز، يساعد تقليل معدل التحديث في إطالة عمر البطارية.

وبالمثل، يمكنك التحقّق من مستوى شحن البطارية، ما قد يؤدي إلى تقليل وتيرة تلقّي التحديثات أو إيقافها تمامًا عندما تكون طاقة البطارية على وشك النفاد.

تحديد حالة الشحن الحالية

ابدأ بتحديد حالة تحصيل الرسوم الحالية. تعمل "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 ذات صلة).

في كثير من الحالات، يكون شحن الجهاز متزامنًا مع وضعه في قاعدة إرساء. لمزيد من المعلومات، يُرجى الاطّلاع على القسم تحديد حالة الإرساء ونوعه ورصدهما.