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

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

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

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

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

ابدأ بتحديد حالة الشحن الحالية. 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;

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

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