Bu güncellemelerin pil ömrü üzerindeki etkisini azaltmak için arka plan güncellemelerinizin sıklığını değiştirirken, geçerli pil seviyesini ve şarj durumunu kontrol etmek iyi bir başlangıç noktasıdır.
Uygulama güncellemeleri yapmanın pil ömrü üzerindeki etkisi, pil seviyesine ve cihazın şarj durumuna bağlıdır. Cihaz AC üzerinden şarj olurken güncelleme yapmanın etkisi göz ardı edilebilir düzeydedir. Bu nedenle çoğu durumda, cihaz bir duvar prizi şarj cihazına bağlıyken yenileme hızınızı en üst düzeye çıkarabilirsiniz. Buna karşılık, cihazın şarjı bitiyorsa güncelleme hızınızı azaltmanız pil ömrünü uzatmaya yardımcı olur.
Benzer şekilde, pil şarj seviyesini kontrol ederek pil şarjı neredeyse tükendiğinde güncellemelerinizin sıklığını azaltabilir, hatta durdurabilirsiniz.
Mevcut şarj durumunu belirleme
Mevcut ödeme durumunu belirleyerek başlayın. BatteryManager
, tüm pil ve şarj ayrıntılarını, şarj durumunu içeren sabit bir Intent
biçiminde yayınlar.
Bu yapışkan bir amaç olduğundan bir BroadcastReceiver
kaydetmenize gerek yoktur. Bir sonraki snippet'te gösterildiği gibi alıcı olarak geçen registerReceiver
null
yöntemini çağırarak mevcut pil durumu niyeti döndürülür. Buraya gerçek bir BroadcastReceiver
nesnesi ekleyebilirsiniz, ancak güncellemeleri sonraki bir bölümde işleyeceğiz. Bu nedenle gerekli değil.
Kotlin
val batteryStatus: Intent? = IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { ifilter -> context.registerReceiver(null, ifilter) }
Java
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = context.registerReceiver(null, ifilter);
Hem mevcut şarj durumunu hem de cihaz şarj ediliyorsa USB veya AC şarj cihazıyla şarj olup olmadığını öğrenebilirsiniz:
Kotlin
val status: Int = batteryStatus?.getIntExtra(BatteryManager.EXTRA_STATUS, -1) ?: -1 val isCharging: Boolean = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL // How are we charging? val chargePlug: Int = batteryStatus?.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) ?: -1 val usbCharge: Boolean = chargePlug == BatteryManager.BATTERY_PLUGGED_USB val acCharge: Boolean = chargePlug == BatteryManager.BATTERY_PLUGGED_AC
Java
// 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;
Tipik olarak, cihazın bir AC şarj cihazına bağlı olduğu durumlarda arka plan güncellemelerinizin hızını en üst düzeye çıkarmanız, USB üzerinden şarj oluyorsa hızı azaltmanız ve pilin şarjı bitiyorsa daha da düşürmeniz gerekir.
Şarj durumundaki değişiklikleri izleyin
Şarj durumu, bir cihazın prize takılması kadar kolay değişebilir; bu nedenle değişiklikleri görmek için şarj durumunu izlemeniz ve yenileme hızınızı buna göre değiştirmeniz önemlidir.
Cihaz her bağlandığında veya güç bağlantısı kesildiğinde BatteryManager
bir işlem yayınlar. Bu etkinlikleri uygulamanız çalışmıyorken bile almak önemlidir. Özellikle de bu etkinlikler, bir arka plan güncellemesi başlatmak için uygulamanızı başlatma sıklığınızı etkilemesi
gerekir. Bu nedenle, bir amaç filtresi içinde ACTION_POWER_CONNECTED
ve ACTION_POWER_DISCONNECTED
tanımlayarak her iki etkinliği de dinlemek için manifest dosyanıza bir BroadcastReceiver
kaydetmeniz gerekir.
<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>
Mevcut pil seviyesini belirleme
Bazı durumlarda geçerli pil seviyesini belirlemek de yararlıdır. Pil şarjı belirli bir seviyenin altına inerse, arka plan güncellemelerinizin hızını azaltmayı seçebilirsiniz.
Mevcut pil seviyesini, aşağıda gösterildiği gibi pil durumu amacına göre ölçekleyip mevcut pil seviyesini çıkartarak bulabilirsiniz:
Kotlin
val batteryPct: Float? = batteryStatus?.let { intent -> val level: Int = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) val scale: Int = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1) level * 100 / scale.toFloat() }
Java
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); float batteryPct = level * 100 / (float)scale;
Pil seviyesindeki önemli değişikliklere tepki verme
Pilin durumunu kolayca sürekli olarak izleyemezsiniz, ancak bunu yapmanız gerekmez.
Genel olarak, pil seviyesini izlemenin etkisi, uygulamanızın normal davranışından daha fazladır. Örneğin, pil azaldığında bekleyen işi iptal etmek üzere manifest'e bir BroadcastReceiver
öğesi kaydetmek, esas olarak pilin daha fazla boşalmasına neden olur (ve bu Android 8.0'dan itibaren imkansızdır). Bunun yerine, çalışmanın ne zaman yayınlanması gerektiğini açıklayan kısıtlamalar yaratabilir ve böylece sistemin uygulamanızı başlatma gücü harcamadan karar vermesini sağlayabilirsiniz.
Pil seviyesi kritik düzeydeyken arka plan güncellemelerinizi çalıştırmamak genellikle iyi bir uygulamadır. Verilerinizin ne kadar yeni olduğu önemli değildir. Telefonunuz siz onları kullanmadan önce kendi kendine kapanır. Bunun için BatteryNotLow
kısıtlaması ile WorkManager kitaplığını kullanarak pil seviyesi düşük olduğunda çalışmanın çalıştırılmaması gerektiğini belirtin (ilgili NetworkType
kısıtlamalarına ek olarak).
Çoğu durumda, bir cihazın şarj edilmesi işlemi, cihazı yuvaya yerleştirmekle aynı anda gerçekleşir. Bir sonraki derste, geçerli yuva durumunu nasıl belirleyeceğiniz ve cihaz yerleştirmedeki değişiklikleri nasıl izleyeceğiniz gösterilmektedir.