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.