默认拒绝设定精确的闹钟

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

SCHEDULE_EXACT_ALARM: यह अनुमति Android 12 में, ऐप्लिकेशन को सटीक समय वाले अलार्म शेड्यूल करें, अब सबसे नए इंस्टॉल किए गए अलार्म के लिए पहले से नहीं दिया जा रहा है Android 13 और उसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन. ये डिफ़ॉल्ट रूप से, 'अस्वीकार किया गया' पर सेट होंगे. अगर आपने जब कोई उपयोगकर्ता, Android 14 वर्शन वाले डिवाइस पर ऐप्लिकेशन का डेटा ट्रांसफ़र करता है, तो बैकअप लेने और वापस लाने की कार्रवाई होती है, तो अनुमति अब भी अस्वीकार रहेगी. अगर कोई मौजूदा ऐप्लिकेशन के पास यह अनुमति पहले से है, तो डिवाइस पर इसे पहले से अनुमति दे दी जाएगी Android 14 में अपग्रेड किया जा सकता है.

सटीक समय वाले अलार्म चालू करने के लिए, SCHEDULE_EXACT_ALARM की अनुमति ज़रूरी है इन एपीआई के ज़रिए या SecurityException को फेंकें:

SCHEDULE_EXACT_ALARM अनुमति के लिए मौजूदा सबसे सही तरीके अब भी जिनमें नीचे दी गई शर्तें भी शामिल हैं:

  • शेड्यूल करने से पहले, canScheduleExactAlarms() से ली गई अनुमति की जांच कर लें सटीक अलार्म.
  • अपने ऐप्लिकेशन को सेट अप करें, ताकि वह फ़ोरग्राउंड ब्रॉडकास्ट पर कॉन्टेंट को सुन सके और उस पर ठीक से प्रतिक्रिया दे सके AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED जिसे उपयोगकर्ता की अनुमति मिलने पर सिस्टम भेजता है.

ऐसे ऐप्लिकेशन की संख्या जिन पर गड़बड़ी का असर पड़ा

अगर किसी डिवाइस में Android 14 या इसके बाद वाला वर्शन चल रहा है, तो यह बदलाव इंस्टॉल किया गया ऐसा ऐप्लिकेशन जिसकी विशेषताएं हैं:

  • Android 13 (एपीआई लेवल 33) या उसके बाद के वर्शन को टारगेट करता है.
  • मेनिफ़ेस्ट में SCHEDULE_EXACT_ALARM अनुमति का एलान करता है.
  • छूट या पहले से छूट के तहत नहीं आता हो स्थिति के हिसाब से बदलें.
  • कैलेंडर या अलार्म क्लॉक ऐप्लिकेशन नहीं है.

कैलेंडर और अलार्म क्लॉक ऐप्लिकेशन को USE_EXACT_ALARM का एलान करना चाहिए

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

इस्तेमाल के ऐसे केस जिनके लिए सटीक समय वाले अलार्म की ज़रूरत नहीं हो सकती

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

नीचे दी गई सूची में ऐसे सामान्य वर्कफ़्लो दिए गए हैं जिनके लिए शायद सटीक अलार्म सेट करने की ज़रूरत न पड़े:

आपके ऐप्लिकेशन के चालू रहने के दौरान, बार-बार होने वाले काम को शेड्यूल करना
set() तरीका तब काम आता है, जब टास्क को रीयल-टाइम में बनाए रखना ज़रूरी हो ध्यान में रखें, जैसे कि कल दोपहर 2 बजे या 30 मिनट में स्विच करना. अगर ऐसा नहीं है, तो हमारा सुझाव है कि postAtTime() या इसके बजाय, postDelayed() तरीके इस्तेमाल करें.
बैकग्राउंड में होने वाले शेड्यूल किए गए काम, जैसे कि ऐप्लिकेशन को अपडेट करना और लॉग अपलोड करना
WorkManager की मदद से, समय-समय पर होने वाले ऐसे काम को शेड्यूल किया जा सकता है जो समय पर काम करता है. आपके पास इंटरवल और फ़्लेक्स इंटरवल (कम से कम 15 मिनट) तय करने का विकल्प है काम के लिए विस्तृत रनटाइम तय करें.
सिस्टम के इस्तेमाल में न होने पर, अनुमानित समय पर अलार्म बंद करने की ज़रूरत है
बिलकुल सटीक जानकारी न देने वाले अलार्म का इस्तेमाल करें. खास तौर पर, setAndAllowWhileIdle() पर कॉल करें.
उपयोगकर्ता की तय की गई कार्रवाई, जो एक खास समय के बाद होनी चाहिए
बिलकुल सटीक जानकारी न देने वाले अलार्म का इस्तेमाल करें. खास तौर पर, set() पर कॉल करें.
उपयोगकर्ता की ओर से तय की गई ऐसी कार्रवाई जो एक तय समयसीमा में हो सकती है
बिलकुल सटीक जानकारी न देने वाले अलार्म का इस्तेमाल करें. खास तौर पर, setWindow() पर कॉल करें. ध्यान दें कि कम से कम 10 मिनट की विंडो होनी चाहिए.

सटीक समय वाले अलार्म का इस्तेमाल जारी रखने के लिए, माइग्रेशन के चरण

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

यह किसी विशेष वर्कफ़्लो का अनुरोध करने के लिए, किसी खास वर्कफ़्लो के जैसा ही है अनुमति:

  1. पुष्टि करने के लिए, ऐप्लिकेशन को AlarmManager.canScheduleExactAlarms() को कॉल करना होगा कि उसमें उचित अनुमति है.
  2. अगर ऐप्लिकेशन को अनुमति नहीं मिली है, तो कोई ऐसा इंटेंट शुरू करें जिसमें ACTION_REQUEST_SCHEDULE_EXACT_ALARM, ऐप्लिकेशन के पैकेज के साथ नाम डालें.

    onResume() तरीके में उपयोगकर्ता का फ़ैसला देखें है.

  3. इसे सुनें AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED ब्रॉडकास्ट, जो उपयोगकर्ता के अनुमति मिलने पर भेजे जाते हैं.

  4. अगर उपयोगकर्ता ने आपके ऐप्लिकेशन को अनुमति दी है, तो आपका ऐप्लिकेशन अलार्म. अगर उपयोगकर्ता ने इसके बजाय अनुमति नहीं दी है, तो शुक्रिया अंदाज़ में अपने ऐप अनुभव ताकि यह उस उपयोगकर्ता से जुड़ी जानकारी न हो जो उस अनुमति से सुरक्षित है.

नीचे दिया गया कोड स्निपेट, SCHEDULE_EXACT_ALARM अनुमति:

val alarmManager: AlarmManager = context.getSystemService<AlarmManager>()!!
when {
   // If permission is granted, proceed with scheduling exact alarms.
   alarmManager.canScheduleExactAlarms() -> {
       alarmManager.setExact(...)
   }
   else -> {
       // Ask users to go to exact alarm page in system settings.
       startActivity(Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
   }
}

अनुमति की जांच करने और उपयोगकर्ता के फ़ैसलों को मैनेज करने के लिए सैंपल कोड onResume():

override fun onResume() {
     
   if (alarmManager.canScheduleExactAlarms()) {
       // Set exact alarms.
       alarmManager.setExact(...)
   }
   else {
       // Permission not yet approved. Display user notice and revert to a fallback  
       // approach.
       alarmManager.setWindow(...)
   }
}

अनुमति न मिलने पर ग्रेसफ़ुल डिग्रेडेशन

कुछ उपयोगकर्ता अनुमति नहीं देंगे. ऐसी स्थिति में हमारा सुझाव है कि साथ ही, आपके अनुभव को कम करने और बेहतरीन अनुभव देने की कोशिश करते हैं इस्तेमाल के उदाहरणों की पहचान करके, संभावित फ़ॉलबैक उपयोगकर्ता अनुभव में मदद मिलती है.

मुक्तियाँ

इस तरह के ऐप्लिकेशन को हमेशा setExact() को कॉल करने की अनुमति है या setExactAndAllowWhileIdle() तरीके:

  • ऐप्लिकेशन, प्लैटफ़ॉर्म सर्टिफ़िकेट से साइन किए गए हैं.
  • खास अधिकार वाले ऐप्लिकेशन.
  • वे ऐप्लिकेशन जो अनुमति वाली सूची में शामिल हैं. अगर आपका ऐप्लिकेशन ज़रूरी शर्तों को पूरा करता है, तो इसका अनुरोध कर सकते हैं. इसके लिए, ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS इंटेंट कार्रवाई).

मंज़ूरी मिलने से पहले

  • SYSTEM_WELLBEING के भूमिका धारकों को पहले से ही मंज़ूरी मिल जाएगी SCHEDULE_EXACT_ALARM.

टेस्ट से जुड़े दिशा-निर्देश

इस बदलाव की जांच करने के लिए, अलार्म और आपके ऐप्लिकेशन के लिए रिमाइंडर ऐक्सेस करने की अनुमति सिस्टम सेटिंग में ऐप्लिकेशन के लिए खास ऐक्सेस पेज से (सेटिंग > ऐप्लिकेशन > ऐप्लिकेशन के लिए खास ऐक्सेस > अलार्म और रिमाइंडर) देखें और अपने ऐप्लिकेशन के व्यवहार के बारे में जानें.