Arka plan güncellemelerinizin pil ömrüyle ilgili etkisini azaltmak için güncellemelerinizin sıklığını değiştirirken, mevcut pil seviyesini ve şarj durumunu kontrol etmek iyi bir başlangıç noktasıdır.
Uygulama güncellemelerinin yapılmasının pil ömrüne etkisi, cihazın pil seviyesine ve şarj durumuna bağlıdır. 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, pil şarj seviyesini kontrol ederek pil şarjı neredeyse bittiğinde güncellemelerinizin sıklığını azaltabilir veya güncellemelerinizi durdurabilirsiniz.
Mevcut şarj durumunu belirleme
Geçerli ödeme durumunu belirleyerek başlayın. BatteryManager
, tüm pil ve şarj ayrıntılarını şarj durumunu içeren yapışkan bir Intent
'te yayınlar.
Yapışkan bir intent olduğundan BroadcastReceiver
kaydetmeniz gerekmez. Aşağıdaki snippet'te gösterildiği gibi registerReceiver
'u çağırıp alıcı olarak null
'yi göndermeniz yeterlidir. Böylece mevcut pil durumu intent'i döndürülür. 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ıyla şarj olup olmadığını 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;
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, şarj USB üzerindenyse hızı azaltmanız ve pil boşalıyorsa daha fazla düşürmeniz gerekir.
Ş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 güç kaynağına bağlandığında veya güç kaynağından ayrıldığında bir işlem yayınlar. 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 mevcut pil seviyesini belirlemek de yararlıdır. Pil şarjı belirli bir seviyenin altındaysa arka plan güncellemelerinizin hızını düşürmeyi seçebilirsiniz.
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 kolayca izleyemezsiniz ancak izlemeniz gerekmez.
Genel olarak, pil seviyesini izlemenin pil üzerindeki etkisi, uygulamanızın normal davranışından daha fazladır. Örneğin, pil azaldığında bekleyen çalışmaları iptal etmek için manifest dosyasında BroadcastReceiver
öğesinin kaydedilmesi, esasen pilin daha fazla boşalmasını sağlar (ve dolayısıyla Android 8.0'dan itibaren bu mümkün değildir). Bunun yerine, uygulamanın ne zaman çalıştırılması gerektiğini açıklayan çalışma kısıtlamaları sağlayabilir ve böylece sistem, uygulamanızı başlatmadan önce güç harcamadan karar verebilir.
Pil seviyesi kritik düzeydeyken arka plan güncellemelerinizi çalıştırmamak genellikle iyi bir uygulamadır. Telefonunuz, siz kullanamadan kendi kendini kapatırsa verilerinizin ne kadar yeni olduğu önemli değildir. Bunu yapmak için pil seviyesi düşük olduğunda çalışmanın çalıştırılmaması gerektiğini belirtmek için (ilgili NetworkType
kısıtlamalarına ek olarak) bir BatteryNotLow
kısıtlaması ile WorkManager kitaplığını kullanın.
Çoğu durumda bir cihazın şarj edilmesi, yuvaya yerleştirilmesi ile tesadüfen gerçekleşebilir. Daha fazla bilgi edinmek için Yuvaya yerleştirme durumunu ve türünü belirleyip izleme bölümüne bakın.