सक्रिय करने की अत्यधिक संख्या

वेकअप, AlarmManager API में मौजूद एक सुविधा है. इसकी मदद से डेवलपर, किसी डिवाइस को तय समय पर चालू करने के लिए अलार्म सेट कर सकते हैं. आपका ऐप्लिकेशन, AlarmManager में मौजूद set() तरीकों में से किसी एक को कॉल करके, जगाने के लिए अलार्म सेट करता है. इसके लिए, वह RTC_WAKEUP या ELAPSED_REALTIME_WAKEUP फ़्लैग का इस्तेमाल करता है. जब वेकअप अलार्म ट्रिगर होता है, तो डिवाइस कम पावर मोड से बाहर आ जाता है. साथ ही, अलार्म के onReceive() या onAlarm() तरीके को लागू करते समय, पार्शियल वेक लॉक को होल्ड करता है. अगर वेकअप अलार्म बार-बार ट्रिगर होते हैं, तो इससे डिवाइस की बैटरी खत्म हो सकती है.

अगर आपका ऐप्लिकेशन डिवाइस को बार-बार चालू कर रहा है, तो इस पेज पर दिए गए दिशा-निर्देशों का इस्तेमाल करके, समस्या का पता लगाया जा सकता है और उसे ठीक किया जा सकता है.

समस्या ठीक करना

AlarmManager को Android प्लैटफ़ॉर्म के शुरुआती वर्शन में पेश किया गया था. हालांकि, समय के साथ-साथ, ऐसे कई इस्तेमाल के उदाहरण सामने आए जिनमें पहले AlarmManager की ज़रूरत होती थी. अब WorkManager जैसी नई सुविधाओं की मदद से, इन उदाहरणों को बेहतर तरीके से पूरा किया जा सकता है. इस सेक्शन में, वेक अप अलार्म की संख्या कम करने के बारे में सलाह दी गई है. हालांकि, लंबे समय तक अलार्म की संख्या कम रखने के लिए, अपने ऐप्लिकेशन को माइग्रेट करने पर विचार करें. इसके लिए, सबसे सही तरीके सेक्शन में दिए गए सुझावों का पालन करें.

अपने ऐप्लिकेशन में उन जगहों का पता लगाएं जहां वेकअप अलार्म शेड्यूल किए जाते हैं. साथ ही, उन अलार्म के ट्रिगर होने की फ़्रीक्वेंसी कम करें. इसके लिए, इन सुझावों का ध्यान रखें:

  • AlarmManager में अलग-अलग set() तरीकों के कॉल देखें. इनमें RTC_WAKEUP या ELAPSED_REALTIME_WAKEUP फ़्लैग शामिल होना चाहिए.

  • हमारा सुझाव है कि आप अपने अलार्म के टैग के नाम में पैकेज, क्लास या तरीके का नाम शामिल करें, ताकि आपको अपने सोर्स में उस जगह की आसानी से पहचान हो सके जहां अलार्म सेट किया गया था. यहां कुछ और सुझाव दिए गए हैं:

    • नाम में, व्यक्तिगत पहचान से जुड़ी कोई भी जानकारी (पीआईआई) शामिल न करें. जैसे, ईमेल पता. ऐसा न करने पर, डिवाइस अलार्म के नाम के बजाय _UNKNOWN को लॉग करता है.
    • क्लास या तरीके का नाम प्रोग्राम के हिसाब से न पाएं. उदाहरण के लिए, getName() को कॉल करके ऐसा न करें, क्योंकि Proguard इसे अस्पष्ट कर सकता है. इसके बजाय, हार्ड-कोड की गई स्ट्रिंग का इस्तेमाल करें.
    • अलार्म टैग में काउंटर या यूनीक आइडेंटिफ़ायर न जोड़ें. सिस्टम, इस तरह से सेट किए गए अलार्म को एक साथ नहीं जोड़ पाएगा, क्योंकि इन सभी के यूनीक आइडेंटिफ़ायर होते हैं.

समस्या ठीक करने के बाद, पुष्टि करें कि वेकअप अलार्म आपकी उम्मीद के मुताबिक काम कर रहे हैं. इसके लिए, यहां दिया गया ADB कमांड चलाएं:

adb shell dumpsys alarm

इस कमांड से, डिवाइस पर अलार्म सिस्टम सेवा की स्थिति के बारे में जानकारी मिलती है. ज़्यादा जानकारी के लिए, dumpsys देखें.

सबसे सही तरीके

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

बैकग्राउंड में चलने वाले टास्क शेड्यूल करने के लिए, AlarmManager का इस्तेमाल न करें. खास तौर पर, बार-बार होने वाले या नेटवर्क से जुड़े बैकग्राउंड टास्क के लिए. बैकग्राउंड टास्क शेड्यूल करने के लिए, WorkManager का इस्तेमाल करें. इससे आपको ये फ़ायदे मिलते हैं:

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

ज़्यादा जानकारी के लिए, बैकग्राउंड प्रोसेसिंग से जुड़ी गाइड देखें.

AlarmManager का इस्तेमाल, समय के हिसाब से की जाने वाली उन कार्रवाइयों को शेड्यूल करने के लिए न करें जो सिर्फ़ ऐप्लिकेशन के चालू होने पर मान्य होती हैं. दूसरे शब्दों में कहें, तो जब उपयोगकर्ता ऐप्लिकेशन से बाहर निकल जाए, तब समय के हिसाब से की जाने वाली कार्रवाई रद्द हो जानी चाहिए. ऐसे मामलों में, Handler क्लास का इस्तेमाल करें. यह इस्तेमाल करने में आसान होती है और ज़्यादा असरदार भी होती है.