Pil Seviyesini ve Şarj Durumunu İzleme

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.