Batas Lokasi Latar Belakang yang diperkenalkan di Android 8.0 (API level 26) telah membawa fokus baru ke subjek tentang cara penggunaan layanan lokasi mempengaruhi 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 update 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 kinerja 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:
- Akurasi: Presisi data lokasi. Secara umum, semakin tinggi akurasinya, maka semakin tinggi pengurasan baterai.
- Frekuensi: Seberapa sering lokasi dihitung. Semakin sering lokasi dihitung, semakin banyak baterai yang digunakan.
- Latensi: Seberapa cepat data lokasi dikirim. 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 geofence, 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 memerlukan 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 geofence, dan hapus update saat aplikasi menerima pemicu keluar geofence. Ini memastikan bahwa aplikasi mendapatkan lebih banyak update lokasi granular saat pengguna telah memasuki area yang ditentukan.
Alur kerja umum untuk skenario ini dapat meliputi memunculkan notifikasi setelah transisi masuk geofence, 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 mengendarai sepeda.
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 ritel.
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 geofence dalam satu waktu. Dalam kasus penggunaan dengan aplikasi yang ingin melacak nomor opsi pedagang ritel, aplikasi tersebut mungkin ingin mendaftarkan geofence yang lebih besar (pada level kota) dan secara dinamis mendaftarkan geofence yang lebih kecil (untuk lokasi di dalam kota) untuk toko dalam geofence yang lebih besar. Bila pengguna memasuki geofence yang lebih besar, geofence yang lebih kecil dapat ditambahkan; bila pengguna keluar dari geofence yang lebih besar, geofence yang lebih kecil dapat dihapus dan geofence 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
, namun 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. 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 update batch. Pendekatan ini mengorbankan latensi untuk lebih banyak data yang tersedia dan kinerja baterai yang lebih baik.
Update dengan akurasi tinggi dan berulang saat pengguna berinteraksi dengan aplikasi lain
Contoh: Aplikasi navigasi atau kebugaran yang terus bekerja 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 bahwa pekerjaan tersebut adalah praktik terbaik yang disarankan. Layanan latar depan memerlukan notifikasi persisten. Untuk informasi selengkapnya, lihat Ringkasan Notifikasi.
Praktik terbaik lokasi
Menerapkan praktik terbaik di bagian ini membantu mengurangi penggunaan baterai aplikasi Anda.
Hapus update lokasi
Sumber umum dari pengurasan baterai yang tidak perlu adalah gagal menghapus update lokasi ketika tidak lagi dibutuhkan. Hal ini dapat terjadi, misalnya, saat metode siklus hidup onStart()
atau onResume()
aktivitas berisi panggilan ke requestlocationUpdates()
tanpa panggilan yang sesuai ke removeLocationUpdates()
di metode siklus hidup onPause()
atau onStop()
.
Anda dapat menggunakan komponen lifecycle-aware untuk mengelola siklus hidup aktivitas di aplikasi Anda lebih baik lagi. Untuk informasi selengkapnya, lihat Menangani Lifecycle dengan Komponen Lifecycle-Aware.
Setel 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 tempat update diminta namun 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 geofence, 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 menyetel interval tempat lokasi dikirim ke aplikasi Anda. Nilai yang diteruskan ke metode setMaxWaitTime()
harus beberapa 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 karean 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 memberlakukan 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 membuat update tersebut tersedia untuk aplikasi Anda. Perhatikan 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.
Saat menggunakan lokasi secara pasif tidak mengakibatkan pengurasan baterai, hati-hati dalam kasus saat penerimaan data lokasi memicu operasi I/O atau CPU yang mahal. Untuk meminimalkan penggunaan baterai, interval yang ditetapkan dalam setFastestInterval()
tidak boleh terlalu kecil.
Anda dapat secara signifikan meningkatkan kinerja baterai perangkat pengguna Anda dengan rekomendasi berikut di halaman ini. Pengguna Anda cenderung menghapus aplikasi yang tidak menguras baterai.