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

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

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

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

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

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

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