बैटरी लेवल और चार्जिंग की स्थिति को मॉनिटर करें

बैटरी लाइफ़ पर अपडेट के असर को कम करने के लिए, बैकग्राउंड अपडेट की फ़्रीक्वेंसी में बदलाव किया जा सकता है. इसके लिए, बैटरी के मौजूदा लेवल और चार्जिंग की स्थिति की जांच करना एक अच्छा तरीका है.

ऐप्लिकेशन अपडेट करने का बैटरी लाइफ़ पर असर, बैटरी लेवल और डिवाइस की चार्जिंग की स्थिति. डिवाइस को एसी से चार्ज करने के दौरान अपडेट करने से, डिवाइस पर बहुत कम असर पड़ता है. इसलिए, ज़्यादातर मामलों में डिवाइस को दीवार पर लगे चार्जर से कनेक्ट करने पर, रीफ़्रेश रेट को बढ़ाया जा सकता है. इसके उलट, अगर डिवाइस चार्ज हो रहा है, तो अपडेट रेट को कम करने से मदद मिलती है बैटरी लाइफ़ को बढ़ाता है.

इसी तरह, बैटरी चार्ज लेवल की जांच करके, बैटरी के खत्म होने पर अपडेट की फ़्रीक्वेंसी कम की जा सकती है या उन्हें पूरी तरह से बंद किया जा सकता है.

चार्जिंग की मौजूदा स्थिति का पता लगाना

सबसे पहले, चार्ज के मौजूदा स्टेटस का पता लगाएं. BatteryManager यह सुविधा, बैटरी और चार्जिंग की पूरी जानकारी स्टिकी Intent में दिखाती है. इसमें यह शामिल है चार्जिंग की स्थिति.

यह एक स्टिक इनटेंट है, इसलिए आपको BroadcastReceiver रजिस्टर करने की ज़रूरत नहीं है. अगले स्निपेट में दिखाए गए तरीके से, registerReceiver को कॉल करके null को रिसीवर के तौर पर पास करें. इससे, बैटरी की मौजूदा स्थिति का इनटेंट वापस मिल जाएगा. आप यहां एक वास्तविक BroadcastReceiver ऑब्जेक्ट पास कर सकते हैं, लेकिन हम बाद के सेक्शन में अपडेट मैनेज करेंगे. इसलिए, यह ज़रूरी नहीं है.

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

चार्जिंग की मौजूदा स्थिति और डिवाइस के चार्ज होने की जानकारी, दोनों को निकाला जा सकता है. साथ ही, यह भी पता लगाया जा सकता है कि डिवाइस को यूएसबी या एसी चार्जर से चार्ज किया जा रहा है या नहीं:

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;

आम तौर पर, डिवाइस को AC चार्जर से कनेक्ट करने पर, बैकग्राउंड में अपडेट की दर को बढ़ाया जाना चाहिए. अगर डिवाइस को यूएसबी से चार्ज किया जा रहा है, तो दर को कम करें. अगर बैटरी खत्म हो रही है, तो दर को और कम करें.

चार्जिंग की स्थिति में होने वाले बदलावों पर नज़र रखें

डिवाइस को प्लग इन करने पर, चार्जिंग की स्थिति में आसानी से बदलाव हो सकता है. इसलिए, बदलावों के लिए चार्जिंग की स्थिति पर नज़र रखना और उसके हिसाब से रीफ़्रेश रेट में बदलाव करना ज़रूरी है.

डिवाइस के कनेक्ट होने पर, BatteryManager किसी कार्रवाई को ब्रॉडकास्ट करता है या पावर से डिसकनेक्ट हो गया. इन इवेंट को पाना तब भी ज़रूरी है, जब आपका ऐप्लिकेशन चलाना—खास तौर पर, क्योंकि इन इवेंट से इस बात पर असर पड़ सकता है कि आप अपना ऐप्लिकेशन कितनी बार चालू करते हैं बैकग्राउंड अपडेट शुरू करें—इसलिए, आपकोBroadcastReceiver ACTION_POWER_CONNECTED और ACTION_POWER_DISCONNECTED इंटेंट फ़िल्टर में.

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

बैटरी का मौजूदा लेवल पता करना

कुछ मामलों में, बैटरी का मौजूदा लेवल पता करना भी मददगार होता है. बैटरी चार्ज की गई मात्रा तय लेवल से कम होने पर, बैकग्राउंड अपडेट की दर को कम किया जा सकता है.

बैटरी के मौजूदा चार्ज का पता लगाने के लिए, बैटरी की स्थिति के इंटेंट से बैटरी के मौजूदा लेवल और स्केल को निकालें. इसके लिए, यहां दिया गया तरीका अपनाएं:

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;

बैटरी लेवल में हुए अहम बदलावों पर कार्रवाई करना

बैटरी की स्थिति को आसानी से लगातार मॉनिटर नहीं किया जा सकता, लेकिन आपको ऐसा करने की ज़रूरत नहीं है.

आम तौर पर, बैटरी लेवल पर नज़र रखने से बैटरी पर ज़्यादा असर पड़ता है, न कि आपके ऐप्लिकेशन के सामान्य काम करने से. उदाहरण के लिए, बैटरी कम होने पर, मेनिफ़ेस्ट में BroadcastReceiver को बाद में किए जाने वाले काम रद्द करने होंगे ये मुख्य रूप से बैटरी को खर्च करते हैं (इसलिए, इस तारीख से संभव नहीं Android 8.0). इसके बजाय, काम पर कंस्ट्रेंट देकर, यह बताया जा सकता है कि इसे कब चलाना चाहिए, इसकी मदद से, सिस्टम आपके ऐप्लिकेशन पर बिजली खर्च किए बिना फ़ैसला ले पाता है.

आम तौर पर, बैटरी बहुत कम होने पर बैकग्राउंड में अपडेट न चलाएं. अगर आपके फ़ोन अपने-आप बंद हो जाता है, तो इससे फ़र्क़ नहीं पड़ता कि आपका डेटा कितना नया है उसका इस्तेमाल कर सकते हैं. ऐसा करने के लिए, BatteryNotLow की पाबंदी के साथ WorkManager लाइब्रेरी का इस्तेमाल करें. इससे यह तय किया जा सकता है कि बैटरी कम होने पर, कोई भी काम न किया जाए. इसके अलावा, NetworkType की अन्य पाबंदियां भी लगाई जा सकती हैं.

कई मामलों में, किसी डिवाइस को लगाने के बाद उसे चार्ज करना शुरू कर दिया जाता है एक डॉक में बंधे हुए हैं. ज़्यादा जानने के लिए, डॉकिंग की स्थिति और टाइप का पता लगाना और उसका डेटा देखना लेख पढ़ें.