Memantau Tingkat Daya Baterai dan Status Pengisian Daya

Saat Anda mengubah frekuensi pembaruan latar belakang untuk mengurangi dampak pembaruan itu pada daya tahan baterai, sebaiknya mulailah dengan memeriksa tingkat baterai saat ini dan status pengisian daya.

Dampak daya tahan baterai karena melakukan pembaruan aplikasi bergantung pada tingkat baterai dan status pengisian daya perangkat. Dampak melakukan pembaruan saat perangkat sedang diisi daya dengan pengisi daya AC bisa diabaikan, jadi umumnya Anda bisa memaksimalkan laju penyegaran bila perangkat terhubung ke pengisi daya di dinding. Sebaliknya, jika perangkat tidak sedang dioperasikan, mengurangi kecepatan pembaruan membantu akan memperpanjang daya tahan baterai.

Begitu pula, Anda bisa memeriksa tingkat pengisian daya baterai, sehingga bisa mengurangi frekuensi—atau bahkan menghentikan—pembaruan saat isi baterai hampir habis.

Menentukan Status Pengisian Daya Saat Ini

Mulailah dengan menentukan status pengisian daya saat ini. BatteryManager menyiarkan semua detail baterai dan pengisian daya dalam Intent permanen yang menyertakan status pengisian daya.

Karena itu adalah maksud permanen, Anda tidak perlu mendaftarkan BroadcastReceiver—dengan hanya memanggil registerReceiver yang meneruskan null sebagai penerima seperti yang ditampilkan dalam cuplikan berikutnya, maksud status baterai berikutnya dikembalikan. Anda bisa meneruskan objek BroadcastReceiver aktual di sini, namun kita akan menangani pembaruan di bagian selanjutnya, jadi hal ini tidak perlu.

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, baik lewat USB maupun pengisi daya AC:

// 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 pembaruan di latar belakang bila perangkat terhubung ke pengisi daya AC, mengurangi kecepatannya jika pengisian daya melalui USB, dan menurunkannya lebih lanjut jika daya baterai sedang digunakan.

Memantau Perubahan dalam Status Pengisian Daya

Status pengisian daya bisa berubah semudah memasang steker perangkat, sehingga perubahan status pengisian daya harus dipantau dan kecepatan penyegaran juga harus diubah.

BatteryManager menyiarkan aksi kapan saja perangkat terhubung atau terputus dari aliran listrik. Kejadian ini harus diterima meskipun aplikasi Anda sedang tidak berjalan—terutama karena kejadian ini akan berdampak pada seberapa sering Anda memulai aplikasi untuk memulai pembaruan latar belakang—jadi Anda harus mendaftarkanBroadcastReceiver dalam manifes untuk mendengarkan kedua kejadian dengan mendefinisikan ACTION_POWER_CONNECTED dan ACTION_POWER_DISCONNECTED dalam filter maksud.

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

Dalam implementasi BroadcastReceiver terkait, Anda bisa mengekstrak status dan metode pengisian daya saat ini seperti dijelaskan dalam langkah sebelumnya.

public class PowerConnectionReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                            status == BatteryManager.BATTERY_STATUS_FULL;

        int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
        boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
        boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
    }
}

Menentukan Tingkat Baterai Saat Ini

Dalam beberapa kasus, ada baiknya juga menentukan tingkat baterai saat ini. Anda bisa memilih mengurangi kecepatan pembaruan latar belakang jika daya baterai di bawah tingkat tertentu.

Anda bisa mengetahui daya baterai saat ini dengan mengekstrak skala dan tingkat daya baterai saat ini dari maksud status baterai seperti yang ditampilkan di sini:

int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

float batteryPct = level / (float)scale;

Memantau Perubahan Signifikan dalam Tingkat Baterai

Anda bisa dengan mudah memantau status baterai, namun tidak harus melakukannya.

Secara umum, pemantauan tingkat baterai yang terus-menerus berdampak lebih besar pada baterai daripada perilaku normal aplikasi Anda, jadi sebaiknya hanya pantau perubahan signifikan dalam tingkat baterai—terutama saat perangkat memasuki atau keluar dari status baterai rendah.

Cuplikan manifes di bawah ini diambil dari unsur filter maksud dalam penerima siaran. Penerima akan dipicu bila daya baterai perangkat tinggal sedikit atau keluar dari kondisi rendah dengan memantau ACTION_BATTERY_LOW dan ACTION_BATTERY_OKAY.

<receiver android:name=".BatteryLevelReceiver">
<intent-filter>
  <action android:name="android.intent.action.ACTION_BATTERY_LOW"/>
  <action android:name="android.intent.action.ACTION_BATTERY_OKAY"/>
  </intent-filter>
</receiver>

Biasanya lebih baik menonaktifkan semua pembaruan latar belakang saat baterai hampir habis. Seberapa pun barunya data Anda, ponsel akan mati sebelum Anda bisa menggunakannya.

Dalam beberapa kasus, tindakan mengisi daya baterai perangkat bersamaan dengan menempatkannya di dok. Pelajaran berikutnya menampilkan cara menentukan status dok saat ini dan memantau perubahan status dok perangkat.