Mengoptimalkan lokasi untuk baterai

Batas Lokasi Latar Belakang yang diperkenalkan di Android 8.0 (API level 26) telah membawa fokus baru ke subjek tentang cara penggunaan layanan lokasi memengaruhi pengurasan baterai. Halaman ini membahas beberapa praktik terbaik layanan lokasi dan yang dapat Anda lakukan sekarang untuk membuat aplikasi Anda lebih hemat baterai. Menerapkan praktik terbaik ini menguntungkan aplikasi Anda, terlepas dari versi platform yang digunakan.

Batas lokasi latar belakang di Android 8.0 memperkenalkan perubahan berikut:

  • Pengumpulan lokasi latar belakang diperlambat dan lokasi dihitung, dan hanya dikirim beberapa kali dalam satu jam.
  • Pemindaian Wi-Fi lebih konservatif, dan pembaruan lokasi tidak dihitung saat perangkat tetap terhubung dengan titik akses statis yang sama.
  • Daya respons pembatasan wilayah berubah dari puluhan detik hingga sekitar dua menit. Perubahan ini secara kentara meningkatkan performa baterai hingga 10 kali lebih baik pada beberapa perangkat.

Halaman ini mengasumsikan bahwa Anda menggunakan Google Location Services API, yang menawarkan akurasi yang lebih tinggi dan mengenakan beban baterai yang lebih ringan dari API lokasi framework. Secara khusus, halaman ini mengasumsikan pemahaman tentang API penyedia lokasi gabungan, yang menggabungkan sinyal dari GPS, Wi-Fi, dan jaringan seluler, serta akselerometer, giroskop, magnetometer, dan sensor lainnya. Anda juga akan familier dengan API pembatasan wilayah, yang dibuat di atas API penyedia lokasi gabungan, dan dioptimalkan untuk kinerja baterai.

Memahami pengurasan baterai

Pengumpulan lokasi dan pengurasan baterai berkaitan langsung dengan aspek berikut:

  • Keakuratan: Ketepatan data lokasi. Secara umum, makin tinggi akurasinya, maka makin tinggi pengurasan baterai.
  • Frekuensi: Seberapa sering lokasi dihitung. Semakin sering lokasi dihitung, makin banyak baterai yang digunakan.
  • Latensi: Seberapa cepat data lokasi dikirimkan. Lebih sedikit latensi biasanya memerlukan lebih banyak baterai.

Akurasi

Anda dapat menentukan akurasi lokasi menggunakan metode setPriority(), yang meneruskan salah satu nilai berikut sebagai argumen:

  • PRIORITY_HIGH_ACCURACY menyediakan lokasi seakurat mungkin, yang dihitung menggunakan input sebanyak yang diperlukan (mengaktifkan GPS, Wi-Fi, dan sel, dan menggunakan berbagai Sensor), dan dapat menyebabkan pengurasan baterai yang signifikan.
  • PRIORITY_BALANCED_POWER_ACCURACY menyediakan lokasi yang akurat sekaligus mengoptimalkan daya. Sangat jarang menggunakan GPS. Biasanya menggunakan kombinasi informasi seluler dan Wi-Fi untuk menghitung lokasi perangkat.
  • PRIORITY_LOW_POWER sangat mengandalkan tower seluler dan menghindari input Wi-Fi dan GPS, yang menyediakan akurasi (tingkat kota) sementara dengan pengurasan baterai minimal.
  • PRIORITY_NO_POWER menerima lokasi secara pasif dari aplikasi lain untuk lokasi yang telah dihitung.

Kebutuhan lokasi sebagian besar aplikasi dapat dipenuhi menggunakan opsi daya seimbang atau daya rendah. Akurasi tinggi harus dicadangkan untuk aplikasi yang berjalan di latar depan dan memerlukan update lokasi real time (misalnya, aplikasi pemetaan).

Frekuensi

Anda bisa menetapkan frekuensi lokasi menggunakan dua metode:

  • Gunakan metode setinterval() untuk menetapkan interval tempat lokasi dihitung untuk aplikasi Anda.
  • Gunakan setFastestInterval() untuk menetapkan interval tempat lokasi yang dihitung untuk aplikasi lain dikirim ke aplikasi Anda.

Anda harus meneruskan kemungkinan nilai terbesar saat menggunakan setInterval(). Ini terutama kerap terjadi untuk pengumpulan lokasi latar belakang, yang sering kali merupakan sumber pengurasan baterai yang tak diinginkan. Menggunakan interval selama beberapa detik harus dicadangkan untuk kasus penggunaan latar depan. Batas lokasi latar belakang yang diperkenalkan dalam Android 8.0 memberlakukan strategi ini, tetapi aplikasi Anda harus berusaha memberlakukannya pada Android 7.0 atau perangkat yang lebih rendah.

Latensi

Anda dapat menetapkan latensi menggunakan metode setMaxWaitTime(), yang biasanya meneruskan nilai yang beberapa kali lebih besar dari interval yang ditetapkan di metode setInterval(). Setelan ini menunda pengiriman lokasi, dan beberapa update lokasi akan dikirimkan dalam batch. Dua perubahan ini membantu meminimalkan konsumsi baterai.

Jika aplikasi Anda tidak segera memerlukan update lokasi, Anda harus meneruskan nilai kemungkinan terbesar ke metode setMaxWaitTime(), yang secara efektif berdagang latensi untuk lebih banyak data dan efisiensi baterai.

Saat menggunakan pembatasan wilayah, aplikasi harus meneruskan nilai besar ke dalam metode setNotificationResponsiveness() untuk menghemat daya. Nilai lima menit atau lebih besar disarankan.

Kasus penggunaan lokasi

Bagian ini menjelaskan beberapa skenario pengumpulan lokasi umumnya, beserta rekomendasi untuk penggunaan API penyedia lokasi gabungan dan pembatasan wilayah yang optimal.

Update latar depan atau terlihat pengguna

Contoh: Aplikasi pemetaan yang membutuhkan update yang sering dan akurat dengan latensi yang sangat rendah. Semua update terjadi di latar depan: pengguna memulai aktivitas, menggunakan data lokasi, kemudian menghentikan aktivitas setelah beberapa saat.

Gunakan metode setPriority() dengan nilai PRIORITY_HIGH_ACCURACY atau PRIORITY_BALANCED_POWER_ACCURACY.

Interval yang ditetapkan di metode setInterval() bergantung pada kasus penggunaan: untuk skenario real time, setel nilai menjadi beberapa detik; jika tidak, batasi hingga beberapa menit (disarankan dua menit atau lebih untuk meminimalkan penggunaan baterai).

Mengetahui lokasi perangkat

Contoh: Aplikasi cuaca ingin mengetahui lokasi perangkat.

Gunakan metode getLastLocation(), yang menampilkan lokasi terbaru yang tersedia (dalam kasus yang jarang terjadi dapat berupa nol). Metode ini memberikan cara mudah mendapatkan lokasi dan tidak mengeluarkan biaya yang terkait dengan permintaan update lokasi secara aktif. Gunakan bersama dengan metode isLocationAvailable(), yang menampilkan true bila lokasi yang ditampilkan oleh getLastLocation() cukup mutakhir.

Memulai update saat pengguna berada di lokasi tertentu

Contoh: Meminta update saat pengguna berada dalam jarak kerja tertentu, rumah, atau lokasi lain.

Gunakan pembatasan wilayah bersama update penyedia lokasi gabungan. Minta update saat aplikasi menerima pemicu masuk pembatasan wilayah, dan hapus update saat aplikasi menerima pemicu keluar pembatasan wilayah. Ini memastikan bahwa aplikasi mendapatkan lebih banyak update lokasi terperinci saat pengguna telah memasuki area yang ditentukan.

Alur kerja umum untuk skenario ini dapat meliputi memunculkan notifikasi setelah transisi masuk pembatasan wilayah, dan meluncurkan aktivitas yang berisi kode untuk meminta update saat pengguna mengetuk notifikasi.

Memulai update berdasarkan status aktivitas pengguna

Contoh: Meminta update hanya saat pengguna mengemudi atau bersepeda.

Gunakan Activity Recognition API bersama dengan update penyedia lokasi gabungan. Minta update saat aktivitas yang ditargetkan terdeteksi, dan hapus update saat pengguna berhenti melakukan aktivitas tersebut.

Alur kerja umum untuk kasus penggunaan ini dapat meliputi memunculkan notifikasi untuk aktivitas yang terdeteksi, dan meluncurkan aktivitas yang berisi kode untuk meminta update saat pengguna mengetuk notifikasi.

Update lokasi latar belakang yang berjalan lama yang terkait dengan area geografis

Contoh: Pengguna ingin diberi tahu saat perangkat berada dalam jarak dekat dengan pedagang retail.

Ini adalah kasus penggunaan yang bagus untuk pembatasan wilayah. Karena kasus penggunaan hampir pasti melibatkan lokasi latar belakang, gunakan metode addGeofences(GeofencingRequest, PendingIntent).

Anda harus menyetel opsi konfigurasi berikut:

  • Jika Anda melacak transisi diam, gunakan metode setLoiteringDelay() yang meneruskan nilai sekitar lima menit atau kurang.

  • Gunakan setNotificationResponsiveness(), yang meneruskan nilai sekitar lima menit. Akan tetapi, pertimbangkan menggunakan nilai sekitar sepuluh menit jika aplikasi Anda dapat mengendalikan kelambatan ekstra dalam respons.

Suatu aplikasi hanya dapat mendaftarkan maksimal 100 pembatasan wilayah dalam satu waktu. Dalam kasus penggunaan dengan aplikasi yang ingin melacak nomor opsi pedagang ritel, aplikasi tersebut mungkin ingin mendaftarkan pembatasan wilayah yang lebih besar (pada level kota) dan secara dinamis mendaftarkan pembatasan wilayah yang lebih kecil (untuk lokasi di dalam kota) untuk toko dalam pembatasan wilayah yang lebih besar. Bila pengguna memasuki pembatasan wilayah yang lebih besar, pembatasan wilayah yang lebih kecil dapat ditambahkan; bila pengguna keluar dari pembatasan wilayah yang lebih besar, pembatasan wilayah yang lebih kecil dapat dihapus dan pembatasan wilayah harus didaftarkan ulang untuk area baru.

Update lokasi latar belakang yang berjalan lama tanpa komponen aplikasi yang terlihat

Contoh: Aplikasi yang melacak lokasi secara pasif

Gunakan metode setPriority() dengan opsi PRIORITY_NO_POWER jika memungkinkan, karena hal itu hampir tidak menyebabkan pengurasan baterai. Jika menggunakan PRIORITY_NO_POWER tidak memungkinkan, gunakan PRIORITY_BALANCED_POWER_ACCURACY atau PRIORITY_LOW_POWER, tetapi hindari menggunakan PRIORITY_HIGH_ACCURACY untuk pekerjaan latar belakang yang berkelanjutan karena opsi ini secara substansial akan menguras baterai.

Jika Anda memerlukan lebih banyak data lokasi dengan memanggil metode setFastestInterval() yang meneruskan nilai yang lebih kecil dari nilai yang Anda teruskan ke setInterval(). Bila digabungkan dengan opsi PRIORITY_NO_POWER, lokasi pasif dapat secara oportunistik mengirim lokasi yang dihitung oleh aplikasi lain tanpa biaya tambahan.

Moderasi frekuensi dengan menambahkan beberapa latensi, dengan menggunakan metode setMaxWaitTime(). Misalnya, jika Anda menggunakan metode setinterval() dengan nilai sekitar 10 menit, sebaiknya pertimbangkan memanggil setMaxWaitTime() dengan nilai antara 30 hingga 60 menit. Dengan menggunakan opsi ini, lokasi dihitung untuk aplikasi Anda sekitar 10 menit, tetapi aplikasi hanya diaktifkan setiap 30 hingga 60 menit dengan beberapa data lokasi yang tersedia sebagai kumpulan update. Pendekatan ini mengorbankan latensi agar data yang tersedia lebih banyak dan kinerja baterai lebih baik.

Update dengan akurasi tinggi dan berulang saat pengguna berinteraksi dengan aplikasi lain

Contoh: Aplikasi kebugaran atau navigasi yang terus berfungsi saat pengguna menonaktifkan layar atau membuka aplikasi lain.

Gunakan layanan latar depan. Jika pekerjaan berat berpotensi dilakukan aplikasi Anda atas nama pengguna, membuat pengguna sadar atas pekerjaan tersebut adalah praktik terbaik yang disarankan. Layanan latar depan memerlukan notifikasi persisten. Untuk informasi selengkapnya, lihat Ringkasan Notifikasi.

Praktik terbaik lokasi

Implementasi praktik terbaik di bagian ini membantu mengurangi penggunaan baterai aplikasi Anda.

Hapus update lokasi

Gagal menghapus update lokasi ketika tidak lagi dibutuhkan merupakan sumber umum pengurasan baterai yang tidak perlu. Hal ini dapat terjadi, misalnya, saat metode siklus proses onStart() atau onResume() aktivitas berisi panggilan ke requestlocationUpdates() tanpa panggilan yang sesuai ke removeLocationUpdates() di metode siklus proses onPause() atau onStop().

Anda dapat menggunakan komponen berbasis siklus proses untuk mengelola siklus proses aktivitas di aplikasi Anda dengan lebih baik. Untuk informasi selengkapnya, lihat Menangani Siklus Proses dengan Komponen Berbasis Siklus Proses.

Menyetel waktu tunggu

Untuk mencegah pengurasan baterai, setel waktu tunggu yang wajar bila update lokasi harus berhenti. Waktu tunggu memastikan bahwa update tidak berlanjut terus-menerus, dan ini melindungi aplikasi di skenario ketika update diminta tetapi tidak dihapus (misalnya, karena bug dalam kode).

Untuk permintaan penyedia lokasi gabungan, tambahkan waktu tunggu dengan memanggil setExpirationDuration(), yang menerima parameter yang menyatakan waktu dalam milidetik sejak metode terakhir dipanggil. Anda juga dapat menambahkan waktu tunggu dengan memanggil setExpirationTime(), yang menerima parameter yang menyatakan waktu habis masa berlaku dalam milidetik sejak sistem terakhir melakukan booting.

Untuk menambahkan waktu tunggu ke permintaan lokasi pembatasan wilayah, panggil metode setExpirationDuration().

Permintaan batch

Untuk semua kasus penggunaan yang bukan latar depan, batch beberapa permintaan bersama. Anda dapat menggunakan metode setInterval() untuk menetapkan interval tempat lokasi akan dihitung. Kemudian, gunakan metode setMaxWaitTime() untuk menetapkan interval tempat lokasi dikirimkan ke aplikasi Anda. Nilai yang diteruskan ke metode setMaxWaitTime() harus berupa kelipatan dari nilai yang diteruskan ke metode setInterval(). Misalnya, perhatikan permintaan lokasi berikut:

Kotlin

val request = LocationRequest()
request.setInterval(10 * 60 * 1000)
request.setMaxWaitTime(60 * 60 * 1000)

Java

LocationRequest request = new LocationRequest();
request.setInterval(10 * 60 * 1000);
request.setMaxWaitTime(60 * 60 * 1000);

Dalam hal ini, lokasi dihitung kira-kira setiap sepuluh menit, dan sekitar enam titik data lokasi dikirimkan dalam batch kira-kira setiap jam. Saat Anda masih mendapatkan update lokasi setiap sekitar sepuluh menit, Anda menghemat baterai karena perangkat Anda hanya akan diaktifkan setiap sekitar satu jam.

Gunakan update lokasi pasif

Dalam kasus penggunaan latar belakang, ada baiknya membatasi update lokasi. Batas Android 8.0 menerapkan praktik ini, tetapi aplikasi yang berjalan di perangkat lama harus berusaha membatasi lokasi latar belakang sebanyak mungkin.

Kemungkinan saat aplikasi Anda berada dalam latar belakang, aplikasi lain mungkin sering meminta update lokasi di latar depan. Layanan lokasi menyediakan update ini untuk aplikasi Anda. Pertimbangkan permintaan lokasi berikut, yang secara oportunistik menggunakan data lokasi:

Kotlin

val request = LocationRequest()
request.setInterval(15 * 60 * 1000)
request.setFastestInterval(2 * 60 * 1000)

Java

LocationRequest request = new LocationRequest();
request.setInterval(15 * 60 * 1000);
request.setFastestInterval(2 * 60 * 1000);

Pada contoh sebelumnya, lokasi dihitung untuk aplikasi Anda kira-kira setiap 15 menit. Jika aplikasi lain meminta lokasi, data disediakan untuk aplikasi Anda dengan interval maksimum dua menit.

Walaupun penggunaan lokasi secara pasif tidak mengakibatkan pengurasan baterai, hati-hati dalam kasus saat penerimaan data lokasi memicu operasi I/O atau CPU yang berat. Untuk meminimalkan penggunaan baterai, interval yang ditetapkan dalam setFastestInterval() tidak boleh terlalu kecil.

Anda dapat meningkatkan kinerja baterai perangkat pengguna Anda secara signifikan dengan mengikuti rekomendasi di halaman ini. Pengguna Anda berkemungkinan kecil menghapus aplikasi yang tidak menguras baterai.