Saat Anda mengubah frekuensi update latar belakang untuk mengurangi efek update tersebut pada masa pakai baterai, memeriksa level baterai saat ini dan status pengisian daya adalah langkah yang tepat untuk memulai.
Dampak daya tahan baterai karena melakukan update aplikasi bergantung pada level baterai dan status pengisian daya perangkat. Dampak melakukan update saat perangkat mengisi daya melalui AC akan sangat kecil, sehingga dalam sebagian besar kasus, Anda dapat memaksimalkan kecepatan refresh setiap kali perangkat terhubung ke pengisi daya dinding. Sebaliknya, jika daya perangkat sedang tidak diisi, mengurangi frekuensi update dapat membantu memperpanjang masa pakai baterai.
Demikian pula, Anda dapat memeriksa level pengisian daya baterai, sehingga dapat mengurangi frekuensi—atau bahkan menghentikan—update 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 menyertakan
status pengisian daya.
Karena intent ini bersifat permanen, Anda tidak perlu menyertakan BroadcastReceiver
. Cukup panggil registerReceiver
dengan null
sebagai penerimanya, seperti ditunjukkan dalam cuplikan di bawah, dan status baterai saat ini akan ditampilkan. Anda dapat meneruskan objek BroadcastReceiver
sebenarnya di sini, tetapi kita akan menangani update di bagian selanjutnya sehingga hal ini tidak perlu.
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 daya, 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 kecepatannya jika pengisian daya melalui USB, dan menurunkannya lebih lanjut jika baterai sedang tidak diisi dayanya.
Memantau perubahan pada status pengisian daya
Status pengisian daya dapat berubah semudah dicolokkannya perangkat ke pengisi daya, sehingga penting untuk memantau perubahan status pengisian daya dan menyesuaikan kecepatan refresh.
BatteryManager
menyiarkan tindakan setiap kali perangkat dihubungkan 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 latar belakang—sehingga 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 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;
Merespons perubahan signifikan pada level daya 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 yang lebih besar
pada baterai daripada perilaku normal aplikasi Anda. Misalnya, mendaftarkan
BroadcastReceiver
dalam manifes untuk membatalkan pekerjaan yang tertunda saat baterai lemah akan
secara utama berfungsi untuk menghabiskan baterai lebih lanjut (dan karenanya
tidak mungkin sejak
Android 8.0). Sebagai gantinya, Anda dapat memberikan batasan pada pekerjaan yang menjelaskan kapan pekerjaan tersebut harus dijalankan,
sehingga sistem dapat membuat keputusan tanpa menghabiskan daya untuk memulai aplikasi Anda.
Sebaiknya jangan jalankan update latar belakang saat baterai
hampir habis. Seberapa pun barunya data Anda, ponsel akan mati sebelum Anda
dapat menggunakannya. Untuk melakukannya,
gunakan library WorkManager
dengan
batasan BatteryNotLow
untuk menentukan bahwa pekerjaan tidak boleh dijalankan jika baterai lemah (selain batasan
NetworkType
yang relevan).
Pada banyak kasus, tindakan mengisi daya baterai perangkat bersamaan dengan menempatkannya ke dok. Untuk mempelajari lebih lanjut, lihat Menentukan dan memantau jenis dan status terpasang ke dok.