Pil için konumu optimize etme

Android 8.0'da (API düzeyi 26) kullanıma sunulan Arka Planda Konum Sınırları, konum hizmetlerinin kullanımının pil tüketimini nasıl etkilediği konusuna yeniden odaklanılmasını sağladı. Bu sayfada, konum hizmetleriyle ilgili en iyi uygulamalardan bazılarına ve uygulamalarınızı daha pil tasarrufu yapmak için şu anda yapabileceğiniz işlemlere değinilmektedir. Bu en iyi uygulamaları, hangi platform üzerinde çalıştığı fark etmeksizin uygulamanız için faydalıdır.

Android 8.0'da arka planda konum sınırları nedeniyle aşağıdaki değişiklikler gerçekleşmiştir:

  • Arka planda konum toplama kısıtlanır, konum hesaplanır ve saatte yalnızca birkaç kez sunulur.
  • Kablosuz ağ taramaları daha ölçülüdür ve cihaz aynı statik erişim noktasına bağlı kaldığında konum güncellemeleri hesaplanmaz.
  • Coğrafi sınır çizme duyarlılığı onlarca saniyeden yaklaşık iki dakikaya değişir. Bu değişiklik, pil performansını önemli ölçüde iyileştirir ve bazı cihazlarda 10 kata kadar daha iyi sonuçlar verir.

Bu sayfada, çerçeve konum API'lerinden daha yüksek doğruluk sunan ve daha hafif bir pil yükü oluşturan Google Konum Hizmetleri API'lerini kullandığınız varsayılmaktadır. Bu sayfada özellikle GPS, kablosuz ağ ve hücresel ağların yanı sıra ivme ölçer, jiroskop, manyetometre ve diğer sensörlerden gelen sinyalleri birleştiren çok kaynaklı konum sağlayıcı API'si hakkında bilgi sahibi olunduğu varsayılır. Ayrıca, çok kaynaklı konum sağlayıcı API'sinin üzerine inşa edilen ve pil performansı için optimize edilmiş coğrafi sınır çizme API'sini de biliyor olmanız gerekir.

Pilin hızlı tükenmesini anlama

Konum bilgisi toplama ve pilin hızlı tükenmesi şu yönleriyle doğrudan ilişkilidir:

  • Doğruluk: Konum verilerinin doğruluk düzeyi. Genelde doğruluk ne kadar yüksek olursa pil o kadar hızlı biter.
  • Sıklık: Konumun ne sıklıkta hesaplandığı. Konum ne kadar sık hesaplanırsa o kadar çok pil kullanılır.
  • Gecikme: Konum verilerinin ne kadar hızlı yayınlanır? Daha az gecikme genellikle daha fazla pil gerektirir.

Doğruluk

Konum doğruluğunu setPriority() yöntemini kullanarak ve aşağıdaki değerlerden birini bağımsız değişken olarak iletebilirsiniz:

  • PRIORITY_HIGH_ACCURACY, mümkün olduğunca çok sayıda giriş kullanılarak hesaplanan (GPS, kablosuz ağ ve hücresel çalışır, çeşitli Sensörler kullanır) mümkün olan en doğru konum bilgisini sağlar ve pilin önemli ölçüde tükenmesine neden olabilir.
  • PRIORITY_BALANCED_POWER_ACCURACY güç için optimize ederken doğru konum bilgisini sağlar. GPS nadiren kullanılır. Cihaz konumunu hesaplamak için genellikle kablosuz ağ ve hücre bilgileri kullanılır.
  • PRIORITY_LOW_POWER büyük ölçüde baz istasyonlarını kullanır, GPS ve kablosuz bağlantı girişlerini önler. Böylece minimum pil tüketimiyle yaklaşık (şehir düzeyinde) doğruluk sağlar.
  • PRIORITY_NO_POWER, konumlarının zaten hesaplanmış olduğu diğer uygulamalardan pasif olarak konum alır.

Çoğu uygulamanın konum ihtiyaçları, dengeli güç veya düşük güç seçenekleri kullanılarak karşılanabilir. Yüksek doğruluk, ön planda çalışan ve gerçek zamanlı konum güncellemeleri (ör. harita oluşturma uygulaması) gerektiren uygulamalar için ayrılmalıdır.

Frekans

Konum sıklığını iki yöntemi kullanarak belirtebilirsiniz:

  • Uygulamanız için konumun hesaplandığı aralığı belirtmek için setinterval() yöntemini kullanın.
  • Diğer uygulamalar için hesaplanan konumun uygulamanıza aktarılma aralığını belirtmek için setFastestInterval() değerini kullanın.

setInterval() özelliğini kullanırken mümkün olan en büyük değeri iletmeniz gerekir. Bu durum, özellikle pil tüketiminin istenmeyen bir nedeni olan arka planda konum toplama işlemi için geçerlidir. Ön plan kullanım alanları için birkaç saniyelik aralıklar kullanılmalıdır. Android 8.0'da sunulan arka planda konum sınırları bu stratejileri zorunlu kılar ancak uygulamanızda bunları Android 7.0 veya önceki sürümlerde zorunlu kılmaya çalışmanız gerekir.

Gecikme

setMaxWaitTime() yöntemini kullanarak gecikmeyi belirtebilirsiniz. Bu yöntem, genellikle setInterval() yönteminde belirtilen aralıktan birkaç kat daha büyük bir değer iletir. Bu ayar konum teslimini geciktirir ve birden fazla konum güncellemesi gruplar halinde teslim edilebilir. Bu iki değişiklik pil tüketimini en aza indirmeye yardımcı olur.

Uygulamanızda hemen konum güncellemesi gerekmiyorsa mümkün olan en büyük değeri setMaxWaitTime() yöntemine iletmeniz gerekir. Böylece, daha fazla veri ve pil verimliliği için gecikmeyi etkili bir şekilde takas edebilirsiniz.

Coğrafi sınırları kullanırken uygulamalar gücü korumak için setNotificationResponsiveness() yöntemine büyük bir değer geçirmelidir. Beş dakika veya daha büyük bir değer önerilir.

Konum kullanım alanları

Bu bölümde, bazı tipik konum toplama senaryolarının yanı sıra, coğrafi sınır çizme ve çok kaynaklı konum sağlayıcı API'lerinin en uygun kullanımına yönelik öneriler açıklanmaktadır.

Kullanıcı tarafından görülebilen veya ön planda yapılan güncellemeler

Örnek: Çok düşük gecikmeyle sık sık doğru güncellemeler gerektiren bir harita oluşturma uygulaması Tüm güncellemeler ön planda gerçekleşir: Kullanıcı bir etkinlik başlatır, konum verilerini tüketir ve kısa bir süre sonra etkinliği durdurur.

setPriority() yöntemini PRIORITY_HIGH_ACCURACY veya PRIORITY_BALANCED_POWER_ACCURACY değeriyle kullanın.

setInterval() yönteminde belirtilen aralık kullanım alanına bağlıdır: Gerçek zamanlı senaryolar için değeri birkaç saniyeye ayarlayın. Aksi takdirde birkaç dakikayla sınırlayın (pil kullanımını en aza indirmek için yaklaşık iki dakika veya daha uzun olması önerilir).

Cihazın konumunu öğrenme

Örnek: Bir hava durumu uygulaması cihazın konumunu bilmek istiyor.

En son kullanılabilir konumu döndüren (Nadiren de olsa boş olan) getLastLocation() yöntemini kullanın. Bu yöntem, konum bilgisini almanın basit bir yolunu sunar ve aktif olarak konum güncellemesi isteğinde bulunmak için ücret ödemez. getLastLocation() tarafından döndürülen konum makul ölçüde güncel olduğunda true sonucunu döndüren isLocationAvailable() yöntemiyle birlikte kullanın.

Kullanıcı belirli bir konumda olduğunda güncellemeleri başlatma

Örnek: Kullanıcı iş, ev veya başka bir konuma belirli bir mesafedeyken güncelleme isteme.

Çok kaynaklı konum sağlayıcısı güncellemeleriyle birlikte coğrafi sınır çizme özelliğini kullanın. Uygulama bir coğrafi sınır giriş tetikleyicisi aldığında güncelleme isteyin ve uygulama bir coğrafi sınır çıkış tetikleyicisi aldığında güncellemeleri kaldırın. Bu, yalnızca kullanıcı tanımlı bir alana girdiğinde uygulamanın daha ayrıntılı konum güncellemeleri almasını sağlar.

Bu senaryonun tipik iş akışı, coğrafi sınır girme geçişi sırasında bir bildirim göstermeyi ve kullanıcı bildirime dokunduğunda güncelleme isteme kodunu içeren bir etkinlik başlatmayı içerebilir.

Kullanıcının etkinlik durumuna göre güncellemeler başlatılıyor

Örnek: Yalnızca kullanıcı araba sürerken veya bisiklete binerken güncelleme isteme.

Etkinlik Tanıma API'sini çok kaynaklı konum sağlayıcı güncellemeleriyle birlikte kullanın. Hedeflenen etkinlik tespit edildiğinde güncelleme isteyin ve kullanıcı bu etkinliği gerçekleştirmeyi bıraktığında güncellemeleri kaldırın.

Bu kullanım alanı için tipik iş akışı, algılanan etkinlik için bir bildirim göstermeyi ve kullanıcı bildirime dokunduğunda güncelleme istemek için kod içeren bir etkinliğin başlatılmasını içerebilir.

Coğrafi alanlarla ilişkili uzun süreli arka planda konum güncellemeleri

Örnek: Kullanıcı, cihaz bir perakendecinin yakınında olduğunda bildirim almak istiyor.

Bu, coğrafi sınır çizme için mükemmel bir kullanım örneğidir. Kullanım alanı neredeyse kesinlikle arka planda konumla ilgili olduğundan addGeofences(GeofencingRequest, PendingIntent) yöntemini kullanın.

Aşağıdaki yapılandırma seçeneklerini ayarlamanız gerekir:

  • Bekleme geçişlerini izliyorsanız yaklaşık beş dakika veya daha kısa bir değer ileten setLoiteringDelay() yöntemini kullanın.

  • Yaklaşık beş dakikalık bir değer ileterek setNotificationResponsiveness() işlevini kullanın. Ancak, uygulamanız yanıt vermedeki fazladan gecikmeyi yönetebilirse yaklaşık on dakikalık bir değer kullanabilirsiniz.

Bir uygulama aynı anda en fazla 100 coğrafi sınır kaydedebilir. Bir uygulamanın çok sayıda perakendeci seçeneğini izlemek istediği bir kullanım örneğinde, uygulama büyük coğrafi sınır (şehir düzeyinde) kaydetmek ve daha geniş coğrafi sınır içindeki mağazalar için daha küçük coğrafi sınırları (şehirdeki konumlar için) dinamik olarak kaydetmek isteyebilir. Kullanıcı büyük bir coğrafi sınıra girdiğinde daha küçük coğrafi sınırlar eklenebilir; kullanıcı daha büyük coğrafi sınırdan çıktığında daha küçük coğrafi sınırlar kaldırılabilir ve coğrafi çitler yeni bir alan için yeniden kaydedilebilir.

Görünür bir uygulama bileşeni olmadan uzun süre çalışan arka planda konum güncellemeleri

Örnek: Konumu pasif olarak izleyen bir uygulama

Pilin bitmesine neredeyse hiç gerek olmadığı için mümkünse PRIORITY_NO_POWER seçeneğiyle setPriority() yöntemini kullanın. PRIORITY_NO_POWER kullanmak mümkün değilse PRIORITY_BALANCED_POWER_ACCURACY veya PRIORITY_LOW_POWER kullanın, ancak arka planda uzun süren çalışmalar için PRIORITY_HIGH_ACCURACY kullanmayın. Bu seçenek pili önemli ölçüde tüketir.

Daha fazla konum verisine ihtiyacınız varsa setFastestInterval() yöntemini çağırarak setInterval() aracına ilettiğinizden daha küçük bir değer ileterek pasif konum kullanın. Pasif konum, PRIORITY_NO_POWER seçeneği ile birlikte kullanıldığında ek ücret gerektirmeden diğer uygulamalar tarafından hesaplanan konumu fırsatçı bir şekilde sağlayabilir.

setMaxWaitTime() yöntemini kullanarak gecikme ekleyerek orta düzeyde sıklık belirleyin. Örneğin, setinterval() yöntemini yaklaşık 10 dakika değerinde kullanırsanız 30 ila 60 dakika arasında bir değerle setMaxWaitTime() çağrısı yapabilirsiniz. Bu seçenekler kullanılarak uygulamanızın konumu yaklaşık olarak 10 dakikada bir hesaplanır, ancak uygulama yalnızca 30-60 dakikada bir uyandırılır ve bazı konum verileri toplu güncelleme olarak kullanılabilir. Bu yaklaşım, gecikme durumunda daha fazla veri kullanılabilir ve daha iyi pil performansı sunar.

Kullanıcı diğer uygulamalarla etkileşimde bulunurken sık sık yüksek doğruluklu güncellemeler

Örnek: Kullanıcı ekranı kapattığında veya farklı bir uygulamayı açtığında çalışmaya devam eden bir navigasyon veya fitness uygulaması.

Bir ön plan hizmeti kullanın. Uygulamanız, kullanıcı adına potansiyel olarak pahalı bir iş yapacaksa kullanıcıyı bu işten haberdar etmek önerilen en iyi uygulamalardan biridir. Ön plan hizmeti için kalıcı bildirim gerekir. Daha fazla bilgi için Bildirimlere Genel Bakış sayfasını inceleyin.

Konumla ilgili en iyi uygulamalar

Bu bölümdeki en iyi uygulamalardan yararlanarak uygulamanızın pil kullanımını azaltabilirsiniz.

Konum güncellemelerini kaldırma

Pilin gereksiz yere boşalmasının yaygın nedenlerinden biri, artık ihtiyaç duyulmadığında konum güncellemelerinin kaldırılamamasıdır. Örneğin, bir etkinliğin onStart() veya onResume() yaşam döngüsü yöntemleri onPause() veya onStop() yaşam döngüsü yöntemlerinde removeLocationUpdates() çağrısı olmadan requestlocationUpdates() öğesine yapılan bir çağrı içerdiğinde bu durum yaşanabilir.

Uygulamanızdaki etkinliklerin yaşam döngüsünü daha iyi yönetmek için yaşam döngüsüne duyarlı bileşenler kullanabilirsiniz. Daha fazla bilgi için Yaşam Döngüsüne Duyarlı Bileşenlerle Yaşam Döngülerini İşleme konusuna bakın.

Zaman aşımlarını ayarlama

Pilin hızlı tükenmesi gibi durumlara karşı koruma sağlamak için konum güncellemelerinin duracağı makul bir zaman aşımı süresi ayarlayın. Zaman aşımı, güncellemelerin süresiz olarak devam etmemesini sağlar ve güncellemelerin istendiği ancak kaldırılmadığı senaryolarda (örneğin, koddaki bir hata nedeniyle) uygulamayı korur.

Çok kaynaklı bir konum sağlayıcı isteği için setExpirationDuration() yöntemini çağırarak zaman aşımı ekleyin. Bu parametre, yöntemin son çağrılmasından bu yana geçen süreyi milisaniye cinsinden temsil eden bir parametre alır. Ayrıca, setExpirationTime() yöntemini çağırarak zaman aşımı da ekleyebilirsiniz. Bu parametre, sistemin son başlatılmasından bu yana geçen süreyi milisaniye cinsinden temsil eden bir parametre alır.

Bir coğrafi sınır konum isteğine zaman aşımı eklemek için setExpirationDuration() yöntemini çağırın.

Toplu istekler

Ön planda olmayan tüm kullanım alanları için birden fazla isteği birlikte gruplandırın. Konumun hesaplanmasını istediğiniz aralığı belirtmek için setInterval() yöntemini kullanabilirsiniz. Ardından, uygulamanızın uygulamanıza yayınlandığı aralığı ayarlamak için setMaxWaitTime() yöntemini kullanın. setMaxWaitTime() yöntemine iletilen değer, setInterval() yöntemine aktarılan değerin katı olmalıdır. Örneğin, aşağıdaki konum isteğini göz önünde bulundurun:

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

Bu durumda konum yaklaşık olarak her on dakikada bir hesaplanır ve yaklaşık olarak saatte bir toplu olarak yaklaşık altı konum veri noktası teslim edilir. Yaklaşık on dakikada bir konum güncellemeleri almaya devam etseniz de cihazınız yalnızca saatte bir uyandırıldığı için pilden tasarruf edersiniz.

Pasif konum güncellemelerini kullanma

Arka plandaki kullanım durumlarında, konum güncellemelerini kısmak iyi bir fikirdir. Android 8.0 sınırlamaları bu uygulamayı zorunlu kılar ancak eski cihazlarda çalışan uygulamalar arka planda konumu mümkün olduğunca sınırlamaya çalışmalıdır.

Uygulamanız arka plandayken sık sık başka bir uygulama ön planda konum güncellemeleri istiyor olabilir. Konum hizmetleri, bu güncellemeleri uygulamanızda kullanılabilir hale getirir. Fırsat olarak konum verilerini tüketen aşağıdaki konum isteğini göz önünde bulundurun:

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

Yukarıdaki örnekte konum, uygulamanız için yaklaşık olarak 15 dakikada bir hesaplanır. Başka uygulamalar konum bilgisi isterse veriler maksimum iki dakikalık aralıklarla uygulamanızın kullanımına sunulur.

Konum verilerini pasif olarak kullanmak pilin bitmesine neden olmaz. Ancak konum verilerinin alınmasının pahalı CPU veya G/Ç işlemlerini tetiklediği durumlarda çok dikkatli olun. Pil maliyetlerini en aza indirmek için setFastestInterval() öğesinde belirtilen aralık çok kısa olmamalıdır.

Bu sayfadaki önerileri uygulayarak kullanıcılarınızın cihazlarının pil performansını önemli ölçüde artırabilirsiniz. Kullanıcılarınızın, pillerini tüketmeyen uygulamaları silme olasılığı daha düşüktür.