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 menjalankan update aplikasi terhadap masa pakai baterai bergantung pada level baterai dan status pengisian daya perangkat. Dampak melakukan update saat perangkat sedang diisi daya melalui pengisi daya AC dapat diabaikan, sehingga dalam sebagian besar kasus, Anda dapat memaksimalkan kecepatan refresh setiap kali perangkat terhubung ke pengisi daya dinding. Sebaliknya, jika daya perangkat tidak diisi daya, mengurangi kecepatan update membantu memperpanjang masa pakai baterai.
Demikian pula, Anda dapat memeriksa level pengisian daya baterai, yang berpotensi mengurangi frekuensi—atau bahkan menghentikan—update 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 menyertakan
status pengisian daya.
Karena intent ini bersifat melekat, Anda tidak perlu mendaftarkan BroadcastReceiver
—cukup memanggil registerReceiver
yang meneruskan
null
sebagai penerima seperti yang ditunjukkan dalam cuplikan berikutnya, intent status baterai saat ini
ditampilkan. Anda dapat meneruskan objek BroadcastReceiver
sebenarnya di sini, tetapi kita akan menangani update pada 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 daya, baik mengisinya 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 frekuensi update di latar belakang jika perangkat terhubung ke pengisi daya AC, mengurangi frekuensinya jika pengisian daya melalui USB, dan menurunkannya lebih jauh jika daya baterai sedang tidak diisi.
Memantau perubahan pada status pengisian daya
Status pengisian daya dapat berubah semudah menghubungkan perangkat ke pengisi daya, sehingga penting untuk memantau perubahan status pengisian daya dan mengubah kecepatan refresh.
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 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 kecepatan update latar belakang jika daya baterai di bawah level tertentu.
Anda dapat menemukan 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;
Memantau 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 memantau level baterai secara terus-menerus memiliki dampak yang lebih besar terhadap baterai daripada perilaku normal aplikasi, jadi sebaiknya pantau hanya perubahan signifikan pada level baterai—terutama saat perangkat memasuki atau keluar dari status baterai rendah.
Cuplikan manifes di bawah diekstrak dari elemen filter intent dalam penerima
siaran. Penerima akan dipicu setiap kali daya baterai perangkat hampir habis atau keluar dari kondisi
rendah dengan memproses ACTION_BATTERY_LOW
dan ACTION_BATTERY_OKAY
.
<receiver android:name=".BatteryLevelReceiver"> <intent-filter> <action android:name="android.intent.action.BATTERY_LOW"/> <action android:name="android.intent.action.BATTERY_OKAY"/> </intent-filter> </receiver>
Sebaiknya nonaktifkan semua update latar belakang saat baterai hampir habis. Tidak masalah seberapa baru data Anda jika ponsel mati sebelum Anda dapat menggunakannya.
Pada banyak kasus, tindakan mengisi daya baterai perangkat bersamaan dengan menempatkannya di dok. Tutorial berikutnya menunjukkan cara menentukan status dok saat ini dan memantau perubahan status dok perangkat.