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 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.