Pil Seviyesini ve Şarj Durumunu İzleme

Arka plan güncellemelerinin etkisini azaltmak için bunların sıklığını değiştirdiğinizde ilgili güncellemeleri almak, mevcut pil seviyesini ve şarj durumunu kontrol etmek başlatabilirsiniz.

Uygulama güncellemelerinin yapılmasının pil ömrüne etkisi, pil seviyesine ve cihazın şarj durumu. Cihaz AC üzerinden şarj olurken güncelleme yapmanın etkisi önemsizdir. Bu nedenle, çoğu durumda cihaz bir prize takılıyken yenileme hızınızı en üst düzeye çıkarabilirsiniz. Aksine, cihaz şarj oluyorsa güncelleme hızınızı düşürmek pil ömrünü uzatmaya yardımcı olur.

Benzer şekilde pilin şarj seviyesini kontrol ederek hatta şarjı bitmek üzereyken güncellemeler bile durdurulur.

Mevcut şarj durumunu belirleme

Öncelikle mevcut şarj durumunu belirleyin. BatteryManager tüm pil ve şarj ayrıntılarını şunu içeren sabit bir Intent içinde yayınlar: şarj durumunu.

Niyet (yapışkan) olduğundan BroadcastReceiver kaydetmeniz gerekmez. registerReceiver öğesini çağırmanız yeterlidir. Sonraki snippet'te gösterildiği gibi alıcı olarak null, mevcut pil durumu niyeti geri döndü. Burada gerçek bir BroadcastReceiver nesnesi iletebilirsiniz ancak güncellemeleri daha sonraki bir bölümde ele alacağımız için bu gerekli değildir.

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ı üzerinden şarj edilip edilmediğini ayıklayabilirsiniz:

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;

Cihaz bir AC şarj cihazına bağlıysa arka plan güncellemelerinizin hızını genellikle en üst düzeye çıkarmalı, USB üzerinden şarj oluyorsa hızı azaltmalı ve pil şarjı azalıyorsa hızı daha da düşürmelisiniz.

Şarj durumundaki değişiklikleri izleme

Şarj durumu, cihazın prize takılması kadar kolay değişebilir. Bu nedenle, şarj durumunu değişiklikler açısından izlemek ve yenileme hızınızı buna göre değiştirmek önemlidir.

BatteryManager, cihaz her bağlandığında veya güç bağlantısı kesildi. Bu etkinliklerin, uygulamanız çalışmasa bile alınması önemlidir. Özellikle de bu etkinlikler, arka planda güncelleme başlatmak için uygulamanızı ne sıklıkta başlattığınızı etkilemesi gerektiğinden, bir intent filtresinde ACTION_POWER_CONNECTED ve ACTION_POWER_DISCONNECTED'yi tanımlayarak her iki etkinliği de dinlemek için manifest dosyanızda 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 seviyesinin belirlenmesi de yararlı olur. Trafiğin zirve yaptığı saatleri, pil şarjı belirli bir seviyenin altında olduğunda arka plan güncelleme hızınızı.

Mevcut pil seviyesini ve ölçeğini, pil durumu intent'inden çıkararak burada gösterildiği gibi 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

Pil durumunu sürekli olarak izleyemezsiniz, ancak bunu yapmanız gerekmez.

Genel olarak, pil seviyesini izlemenin pil üzerindeki etkisi, uygulamanızın normal davranışından daha fazladır. Örneğin, pil seviyesi düşük olduğunda bekleyen işi iptal etmek için manifest dosyasına bir BroadcastReceiver kaydetmek, esas olarak pili daha da tüketmeye yarar (bu nedenle Android 8.0'dan beri mümkün değildir). Bunun yerine işin ne zaman yürütülmesi gerektiğini açıklayan iş kısıtlamaları sağlayabilirsiniz. Bu da sistemin uygulamanızı başlatmadan önce karar vermesini sağlar.

Arka plan güncellemelerinizi pil seviyesi kritik derecede düşükken çalıştırmamak genellikle iyi bir uygulamadır. Telefonunuz siz gelmeden kendi kendine kapanıyorsa verilerinizin ne kadar yeni olduğu önemli değildir nasıl yararlanabileceğini belirleyin. Bunu yapmak için WorkManager kitaplığını kullanma şununla: BatteryNotLow kısıtlaması pil seviyesi düşükse çalışmanın yapılmaması gerektiğini belirtmek için (geçerli NetworkType kısıtlama).

Çoğu durumda bir cihazı şarj etme işlemi, cihazın yuvaya yerleştirdik. Daha fazla bilgi edinmek için Yuvaya yerleştirme durumunu ve türünü belirleme ve izleme başlıklı makaleyi inceleyin.