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

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

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

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

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

सबसे पहले, चार्ज के मौजूदा स्टेटस का पता लगाएं. 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);

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

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 की अन्य पाबंदियां भी लगाई जा सकती हैं.

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