سطح باتری و وضعیت شارژ را کنترل کنید

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

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

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

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

با تعیین وضعیت شارژ فعلی شروع کنید. 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 در فیلتر intent.

<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 مربوطه) کار نباید اجرا شود.

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