نظارت بر سطح باتری و وضعیت شارژ

وقتی درحال تغییر دادن دفعات به‌روزرسانی‌های پس‌زمینه هستید تا تأثیر این به‌روزرسانی‌ها را بر عمر باتری کاهش دهید، بررسی سطح کنونی باتری و وضعیت شارژ نقطه شروع خوبی است.

تأثیر به‌روزرسانی‌های برنامه بر عمر باتری به سطح باتری و وضعیت شارژ دستگاه بستگی دارد. تأثیر انجام به‌روزرسانی‌ها درحین شارژ شدن دستگاه با برق متناوب ناچیز است، بنابراین در اکثر موارد می‌توانید هر زمان که دستگاه به شارژر دیواری متصل است، نرخ بازآوری را به حداکثر برسانید. برعکس، اگر دستگاه درحال تخلیه شارژ است، کاهش نرخ به‌روزرسانی به افزایش عمر باتری کمک می‌کند.

به‌طور مشابه، می‌توانید سطح شارژ باتری را بررسی کنید و به‌طور بالقوه دفعات به‌روزرسانی را کاهش دهید یا حتی وقتی شارژ باتری تقریباً تمام شده است، به‌روزرسانی‌ها را متوقف کنید.

تعیین وضعیت شارژ فعلی

با تعیین وضعیت شارژ فعلی شروع کنید. BatteryManager همه جزئیات باتری و شارژ را در Intent چسبانی که شامل وضعیت شارژ است پخش می‌کند.

چون این یک قصد چسبنده است، نیازی به ثبت BroadcastReceiver ندارید—با فراخوانی ساده registerReceiver و ارسال null به‌عنوان گیرنده، همان‌طور که در قطعه کد بعدی نشان داده شده است، قصد وضعیت فعلی باتری برگردانده می‌شود. می‌توانید یک شیء واقعی BroadcastReceiver را در اینجا وارد کنید، اما ما به‌روزرسانی‌ها را در بخش بعدی مدیریت خواهیم کرد، بنابراین نیازی به این کار نیست.

کاتلین

val batteryStatus: Intent? = IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { ifilter ->
    context.registerReceiver(null, ifilter)
}

جاوا

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);

می‌توانید هم وضعیت شارژ فعلی و هم اینکه آیا دستگاه ازطریق شارژر USB یا AC شارژ می‌شود را استخراج کنید:

کاتلین

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

جاوا

// 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>

تعیین سطح فعلی باتری

در برخی موارد، تعیین سطح فعلی باتری نیز مفید است. اگر شارژ باتری کمتر از سطح خاصی باشد، می‌توانید انتخاب کنید که نرخ به‌روزرسانی‌های پس‌زمینه کاهش یابد.

می‌توانید شارژ فعلی باتری را با استخراج سطح و مقیاس فعلی باتری از هدف وضعیت باتری پیدا کنید، همان‌طور که در اینجا نشان داده شده است:

کاتلین

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()
}

جاوا

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 محدودیت مربوطه).

در بسیاری از موارد، عمل شارژ کردن دستگاه با قرار دادن آن در پایه هم‌زمان است. برای کسب اطلاعات بیشتر، تعیین و نظارت بر وضعیت و نوع اتصال را ببینید.