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