Memantau Level Daya dan Status Pengisian Daya Baterai

Saat Anda mengubah frekuensi pembaruan latar belakang untuk mengurangi efeknya pembaruan tentang masa pakai baterai, memeriksa level baterai dan status pengisian daya saat ini adalah tempat yang baik untuk memulai.

Dampak update aplikasi terhadap daya tahan baterai bergantung pada level baterai dan status pengisian daya perangkat. Dampak menjalankan update saat perangkat mengisi daya melalui AC dapat diabaikan, jadi dalam sebagian besar kasus, Anda dapat memaksimalkan kecepatan refresh setiap kali perangkat terhubung ke pengisi daya dinding. Sebaliknya, jika perangkat sedang tidak diisi dayanya, mengurangi kecepatan pembaruan akan membantu memperpanjang daya tahan baterai.

Demikian pula, Anda dapat memeriksa level pengisian daya baterai, yang berpotensi mengurangi frekuensi—atau bahkan berhenti—pembaruan Anda saat daya baterai hampir habis.

Menentukan status pengisian daya saat ini

Mulai dengan menentukan status pengisian daya saat ini. BatteryManager menyiarkan semua detail baterai dan pengisian daya dalam Intent melekat yang mencakup mengetahui status pengisian daya.

Karena merupakan intent melekat, Anda tidak perlu mendaftarkan BroadcastReceiver—hanya dengan memanggil registerReceiver yang meneruskan null sebagai penerima seperti yang ditunjukkan dalam cuplikan berikutnya, intent status baterai saat ini adalah dikembalikan. Anda dapat meneruskan objek BroadcastReceiver sebenarnya di sini, tetapi kita akan menangani pembaruan di bagian selanjutnya sehingga hal ini tidak perlu dilakukan.

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);

Anda bisa mengekstrak status pengisian daya saat ini dan, jika perangkat sedang diisi daya, apakah perangkat sedang mengisi daya melalui pengisi daya USB atau 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;

Biasanya Anda harus memaksimalkan kecepatan update latar belakang jika perangkat tersambung ke pengisi daya AC, mengurangi kecepatan pengisian daya melalui USB, dan menurunkannya lebih lanjut jika baterai sedang tidak diisi.

Memantau perubahan pada status pengisian daya

Status pengisian daya dapat berubah semudah perangkat dicolokkan ke pengisi daya, jadi penting untuk pantau perubahan pada status pengisian daya dan sesuaikan kecepatan refresh.

BatteryManager menyiarkan tindakan setiap kali perangkat terhubung atau terputus dari sumber listrik. Penting untuk menerima peristiwa ini meskipun aplikasi Anda tidak berjalan—terutama karena peristiwa ini harus memengaruhi seberapa sering Anda memulai aplikasi untuk memulai update latar belakang—jadi Anda harus mendaftarkan BroadcastReceiver dalam manifes untuk memproses kedua peristiwa dengan menentukan ACTION_POWER_CONNECTED dan ACTION_POWER_DISCONNECTED dalam filter 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>

Menentukan level daya baterai saat ini

Dalam beberapa kasus, menentukan level daya baterai saat ini juga merupakan tindakan yang berguna. Anda dapat memilih untuk mengurangi kecepatan pembaruan di latar belakang jika daya baterai di bawah level tertentu.

Anda dapat menemukan daya baterai saat ini dengan mengekstrak level baterai saat ini dan skala dari intent status baterai seperti yang ditampilkan di sini:

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;

Bereaksi terhadap perubahan signifikan pada level baterai

Anda bisa dengan mudah memantau status baterai secara terus-menerus, tetapi hal ini tidak perlu dilakukan.

Secara umum, dampak pemantauan level baterai memiliki dampak dampak pada baterai daripada perilaku normal aplikasi Anda. Misalnya, mendaftarkan BroadcastReceiver dalam manifes untuk membatalkan pekerjaan yang tertunda saat baterai lemah akan utamanya berfungsi untuk menguras baterai lebih lanjut (dan karenanya tidak mungkin karena Android 8.0). Sebagai gantinya, Anda dapat memberikan batasan pada pekerjaan yang menjelaskan kapan harus dijalankan, memungkinkan sistem membuat keputusan tanpa menghabiskan daya untuk memulai aplikasi Anda.

Biasanya lebih baik untuk tidak menjalankan pembaruan di latar belakang saat baterai sangat rendah. Keaktualan data Anda tidak akan ada artinya jika ponsel mati sebelum Anda dapat memanfaatkannya. Untuk melakukannya: menggunakan library WorkManager dengan Batasan BatteryNotLow untuk menentukan bahwa pekerjaan tidak boleh dijalankan jika baterai lemah (selain batasan NetworkType).

Pada banyak kasus, tindakan mengisi daya baterai perangkat bersamaan dengan menempatkannya di dok. Berikutnya menunjukkan cara menentukan status dok saat ini dan memantau perubahan pada perangkat terpasang ke dok.