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

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

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

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

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

ابدأ بتحديد حالة الشحن الحالية. ويعمل جهاز "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). بدلاً من ذلك، يمكنك توفير قيود على العمل تصف متى يجب تشغيله، مما يتيح للنظام اتخاذ القرار دون إنفاق الطاقة في بدء تطبيقك.

من الممارسات الجيدة عمومًا عدم تشغيل تحديثات الخلفية عندما تكون البطارية منخفضة للغاية. لا يهم مدى حداثة بياناتك إذا تم إيقاف تشغيل الهاتف قبل أن تتمكن من الاستفادة منه. للقيام بذلك، استخدم مكتبة WorkManager مع قيد BatteryNotLow لتحديد أنه يجب عدم تنفيذ العمل إذا كانت طاقة البطارية منخفضة (بالإضافة إلى أي قيود ذات صلة NetworkType).

في كثير من الحالات، يتم شحن الجهاز بالتزامن مع وضعه في قاعدة الإرساء. ويوضح لك الدرس التالي كيفية تحديد حالة الإرساء الحالية ومراقبة التغييرات في إرساء الجهاز.