Memantau Level Daya dan Status Pengisian Daya Baterai

Saat Anda mengubah frekuensi update latar belakang untuk mengurangi efek update tersebut terhadap masa pakai baterai, memeriksa level baterai dan status pengisian daya saat ini adalah tempat yang baik untuk memulai.

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

Demikian pula, Anda dapat memeriksa level pengisian daya baterai, yang berpotensi mengurangi frekuensi—atau bahkan penghentian—update Anda saat pengisian 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 menyertakan status pengisian daya.

Karena ini adalah 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 ditampilkan. Anda dapat meneruskan objek BroadcastReceiver yang sebenarnya di sini, tetapi kita akan menangani update 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 dapat mengekstrak status pengisian daya saat ini dan, jika perangkat sedang diisi dayanya, baik mengisi daya melalui USB atau pengisi daya 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 terhubung ke pengisi daya AC, mengurangi frekuensinya jika pengisian daya melalui USB, dan menurunkannya lebih jauh jika daya baterai sedang digunakan.

Memantau perubahan pada status pengisian daya

Status pengisian daya dapat berubah semudah menghubungkan perangkat ke pengisi daya, sehingga penting untuk memantau status pengisian daya untuk perubahan dan mengubah kecepatan refresh sebagaimana mestinya.

BatteryManager menyiarkan tindakan setiap kali perangkat terhubung atau terputus dari aliran listrik. Penting untuk menerima peristiwa ini meskipun aplikasi Anda tidak berjalan—terutama karena peristiwa ini akan memengaruhi seberapa sering Anda memulai aplikasi untuk memulai update di latar belakang—jadi Anda harus mendaftarkan BroadcastReceiver dalam manifes untuk memproses kedua peristiwa tersebut 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 frekuensi update latar belakang jika daya baterai di bawah level tertentu.

Anda dapat mengetahui daya baterai saat ini dengan mengekstrak level dan skala baterai saat ini dari intent status baterai seperti yang ditunjukkan 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 level baterai yang signifikan

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

Secara umum, dampak pemantauan level baterai memiliki dampak yang lebih besar pada baterai daripada perilaku normal aplikasi. Misalnya, mendaftarkan BroadcastReceiver dalam manifes untuk membatalkan pekerjaan yang tertunda saat baterai lemah akan terutama akan menghabiskan baterai lebih lanjut (dan oleh karena itu tidak mungkin dilakukan sejak Android 8.0). Sebagai gantinya, Anda dapat memberikan batasan pada pekerjaan yang mendeskripsikan kapan aplikasi tersebut harus dijalankan, sehingga sistem dapat membuat keputusan tanpa menghabiskan daya untuk memulai aplikasi Anda.

Sebaiknya jangan menjalankan update latar belakang saat baterai hampir habis. Kesegaran data Anda tidak akan sia-sia jika ponsel mati sebelum Anda dapat menggunakannya. Untuk melakukannya, gunakan library WorkManager dengan batasan BatteryNotLow untuk menentukan bahwa pekerjaan tidak boleh dijalankan jika baterai hampir habis (selain batasan NetworkType yang relevan).

Pada banyak kasus, tindakan mengisi daya baterai perangkat bersamaan dengan menempatkannya di dok. Pelajaran berikutnya menunjukkan cara menentukan status dok saat ini dan memantau perubahan dalam dok perangkat.