AlarmManager एक Android सिस्टम सेवा है जो एप्लिकेशन को निर्दिष्ट समय पर कार्य निष्पादित करने की अनुमति देती है, भले ही एप्लिकेशन चल नहीं रहा हो या डिवाइस स्लीप मोड में हो। JobScheduler या WorkManager के विपरीत, AlarmManager सटीक ट्रिगरिंग की गारंटी देता है, जो इसे अलार्म, कैलेंडर रिमाइंडर और समय-महत्वपूर्ण कार्यों के लिए अपरिहार्य बनाता है। Android Developers, 2026 के अनुसार, Android 4.4 से शुरू होकर, setRepeating एक गैर-सटीक दोहराव की तरह व्यवहार करता है, और सटीक अलार्म के लिए setExact या setAlarmClock की आवश्यकता होती है।
मुख्य बिंदु
AlarmManager एक Android सिस्टम सेवा है जो सटीक या अनुमानित निष्पादन समय के साथ कार्यों को शेड्यूल करने के लिए API प्रदान करती है। यह Android के पहले संस्करण से मौजूद है और निर्दिष्ट समय पर कोड निष्पादित करने का एकमात्र विश्वसनीय तरीका बना हुआ है, चाहे एप्लिकेशन और डिवाइस की स्थिति कुछ भी हो।
कार्य सिद्धांत सरल है: एप्लिकेशन सिस्टम को निर्धारित समय के साथ एक PendingIntent भेजता है। जब निर्दिष्ट समय आता है, तो सिस्टम पंजीकृत BroadcastReceiver को Intent भेजता है या Service शुरू करता है। भले ही डिवाइस स्लीप मोड में हो, WakeLock प्रोसेसर को जागने और ईवेंट को संसाधित करने की अनुमति देता है।
AlarmManager का मुख्य अनुप्रयोग क्षेत्र सटीक समय की आवश्यकता वाले कार्य हैं: अलार्म, कैलेंडर रिमाइंडर, एक विशिष्ट समय पर लंबी अवधि के संचालन शुरू करना। उन कार्यों के लिए जहां सटीकता महत्वपूर्ण नहीं है (दैनिक सिंक्रनाइज़ेशन), Google WorkManager या JobScheduler की सिफारिश करता है क्योंकि वे अधिक ऊर्जा-कुशल हैं।
AlarmManager एप्लिकेशन से PendingIntent और ट्रिगर समय प्राप्त करता है। सिस्टम इस अनुरोध को अपने आंतरिक शेड्यूलर में सहेजता है और Intent वितरित करने के लिए निर्दिष्ट समय पर प्रोसेसर को जगाता है। डेवलपर को इस Intent को संभालने के लिए पहले से एक BroadcastReceiver पंजीकृत करना होगा।
AlarmManager 4 प्रकार के अलार्म का समर्थन करता है: ELAPSED_REALTIME (बूट के बाद का समय, नहीं जगाता), RTC (वास्तविक समय, नहीं जगाता), ELAPSED_REALTIME_WAKEUP (बूट के बाद का समय, डिवाइस को जगाता है), और RTC_WAKEUP (वास्तविक समय, जगाता है)। WAKEUP संस्करण आवश्यक हैं यदि कार्य को तब भी निष्पादित होना चाहिए जब डिवाइस सो रहा हो।
| प्रकार | समय | जगाता है | उदाहरण |
|---|---|---|---|
| ELAPSED_REALTIME | बूट के बाद से | नहीं | अपटाइम टाइमर |
| RTC | Unix टाइमस्टैम्प | नहीं | लॉगिंग |
| ELAPSED_REALTIME_WAKEUP | बूट के बाद से | हाँ | आवधिक कार्य |
| RTC_WAKEUP | Unix टाइमस्टैम्प | हाँ | अलार्म घड़ी |
Android 12 (API 31) से शुरू करके, सटीक अलार्म (setExact) का उपयोग करने के लिए SCHEDULE_EXACT_ALARM अनुमति की आवश्यकता होती है। उपयोगकर्ता इसे सेटिंग्स के माध्यम से रद्द कर सकता है। उन एप्लिकेशन के लिए जिन्हें डिस्प्ले के साथ सटीक अलार्म की आवश्यकता है (जैसे, घड़ी ऐप्स), USE_EXACT_ALARM का उपयोग किया जाता है, जो इंस्टॉलेशन पर दी जाती है।
AlarmManager कार्यों को शेड्यूल करने के लिए तीन मुख्य विधियाँ प्रदान करता है। विधि का चुनाव ट्रिगरिंग सटीकता और डिवाइस की बिजली खपत पर प्रभाव निर्धारित करता है।
set — एक बार के गैर-सटीक ट्रिगर के लिए मूल विधि। सिस्टम अन्य ईवेंट के साथ समूह बनाने के लिए समय को कुछ मिनटों तक स्थानांतरित कर सकता है। उन कार्यों के लिए उपयुक्त जहां सटीकता महत्वपूर्ण नहीं है: एप्लिकेशन खोलने के लिए रिमाइंडर।
setRepeating — आवधिक दोहराव के लिए एक विधि। Android 4.4 (API 19) से, setRepeating गैर-सटीक हो गया है — अंतराल भिन्न हो सकते हैं। सिस्टम अब स्थिर अवधि की गारंटी नहीं देता है। setRepeating के बजाय, पुनर्निर्धारण के साथ setExact या PeriodicWorkRequest के साथ WorkManager का उपयोग करने की अनुशंसा की जाती है।
setExact — सटीक एक बार के ट्रिगर के लिए एक विधि। सिस्टम निर्दिष्ट समय के जितना संभव हो उतना करीब डिवाइस को जगाता है। setAlarmClock setExact का एक विशेष मामला है जो स्टेटस बार में अलार्म आइकन भी दिखाता है और सभी अलार्म प्रकारों में सबसे अधिक प्राथमिकता रखता है।
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
// सटीक एक बार का अलार्म
val intent = Intent(this, AlarmReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(
this, 0, intent,
PendingIntent.FLAG_IMMUTABLE
)
alarmManager.setAlarmClock(
AlarmManager.AlarmClockInfo(
targetTime, pendingIntent
),
pendingIntent
)
एक सामान्य परिदृश्य एक विशिष्ट समय पर दैनिक अनुस्मारक बनाना है। इस उद्देश्य के लिए setExact के साथ RTC_WAKEUP का उपयोग किया जाता है। ट्रिगर होने पर, BroadcastReceiver एक सूचना या Service लॉन्च करता है। प्रसंस्करण के बाद, कार्य को अगले दिन के लिए पुनर्निर्धारित किया जाना चाहिए।
class ReminderReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent?) {
val notificationManager =
context.getSystemService(Context.NOTIFICATION_SERVICE)
as NotificationManager
val notification = NotificationCompat.Builder(
context, "reminder_channel"
)
.setContentTitle("अनुस्मारक")
.setContentText("कार्य पूरा करने का समय")
.setSmallIcon(R.drawable.ic_reminder)
.build()
notificationManager.notify(1001, notification)
}
}
दैनिक दोहराव के लिए, अगले ट्रिगर समय की गणना के साथ setExact का उपयोग किया जाता है। विभिन्न प्रकार के अनुस्मारकों की पहचान करने के लिए Intent में फ़्लैग पास किए जा सकते हैं। सुनिश्चित करें कि BroadcastReceiver WAKEUP क्रिया हैंडलिंग के साथ AndroidManifest.xml में पंजीकृत है।
fun scheduleDailyReminder(context: Context, hour: Int, minute: Int) {
val calendar = Calendar.getInstance().apply {
set(Calendar.HOUR_OF_DAY, hour)
set(Calendar.MINUTE, minute)
set(Calendar.SECOND, 0)
if (before(Calendar.getInstance())) {
add(Calendar.DAY_OF_MONTH, 1)
}
}
val alarmManager =
context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
calendar.timeInMillis,
pendingIntent
)
}
AlarmManager एक शक्तिशाली लेकिन उच्च-ऊर्जा खपत वाला उपकरण है। प्रत्येक WAKEUP अलार्म डिवाइस को स्लीप मोड से बाहर लाता है, बैटरी चार्ज की खपत करता है। Google सटीक अलार्म के उपयोग को कम करने और Doze Mode पर प्रभाव को कम करने के लिए Android 6+ पर setExactAndAllowWhileIdle को प्राथमिकता देने की अनुशंसा करता है। सटीकता आवश्यकताओं के बिना आवधिक कार्यों के लिए, PeriodicWorkRequest के साथ WorkManager का उपयोग करें, जिसे डिवाइस को जगाने की आवश्यकता नहीं होती है और प्रत्येक निष्पादन पर बैटरी खत्म नहीं होती है।
AlarmManager के परीक्षण के लिए, Android Test Framework से TestAlarmManager का उपयोग करें। यह वास्तविक समय की प्रतीक्षा किए बिना अलार्म ट्रिगर का अनुकरण करने की अनुमति देता है। Robolectric ShadowAlarmManager प्रदान करता है, जो set, setExact और setRepeating कॉल को इंटरसेप्ट करता है, जबरन ट्रिगरिंग और शेड्यूल किए गए कार्यों की संख्या की जाँच के लिए विधियाँ प्रदान करता है। BroadcastReceiver के यूनिट परीक्षणों के लिए, Robolectric.getForegroundScheduler() का उपयोग करें। IdlingResource के साथ Espresso परीक्षण भी उपलब्ध हैं जो एकीकरण परीक्षणों में अलार्म ट्रिगरिंग की प्रतीक्षा करते हैं।
यदि आपका एप्लिकेशन आवधिक कार्यों के लिए AlarmManager का उपयोग करता है जिन्हें सटीक समय की आवश्यकता नहीं है, तो WorkManager में माइग्रेट करने पर विचार करें। न्यूनतम 15 मिनट के अंतराल के साथ PeriodicWorkRequest setRepeating को बदल देता है, जबकि WorkManager रीबूट के बाद निष्पादन सुनिश्चित करता है, Doze Mode को संभालता है, और SCHEDULE_EXACT_ALARM अनुमति की आवश्यकता नहीं होती है। समय-महत्वपूर्ण कार्यों (सुबह 7 बजे अलार्म) के लिए, AlarmManager एकमात्र सही विकल्प बना हुआ है। इष्टतम रणनीति केवल setAlarmClock के साथ अलार्म के लिए AlarmManager का उपयोग करना है, और अन्य सभी पृष्ठभूमि कार्यों को WorkManager में स्थानांतरित करना है।
सटीकता आवश्यकताओं के बिना आवधिक कार्यों के लिए, PeriodicWorkRequest के साथ WorkManager का उपयोग करें। सटीक समय वाले लेकिन स्लीप मोड में ट्रिगर करने के लिए महत्वपूर्ण नहीं कार्यों के लिए — बिना WAKEUP के setExact का उपयोग करें। और केवल अनिवार्य जागृति वाले अलार्म के लिए — setAlarmClock या RTC_WAKEUP का उपयोग करें।
Android 12+ पर SCHEDULE_EXACT_ALARM अनुमति की जाँच करना भी महत्वपूर्ण है। यदि अनुमति नहीं दी गई है, तो setExact सामान्य set (गैर-सटीक) की तरह काम करेगा। जाँच करने के लिए AlarmManager.canScheduleExactAlarms() का उपयोग करें। यदि अनुमति गायब है, तो आप Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM) के माध्यम से उपयोगकर्ता को सेटिंग्स में जाने का संकेत दे सकते हैं।
AlarmManager की एक महत्वपूर्ण विशेषता — डिवाइस रीबूट के बाद सभी शेड्यूल किए गए अलार्म रीसेट हो जाते हैं। उन्हें बहाल करने के लिए, आपको Intent.ACTION_BOOT_COMPLETED को संभालने वाला BroadcastReceiver घोषित करना होगा और onReceive विधि में सभी सक्रिय अलार्म को पुनर्निर्धारित करना होगा। इसके बिना, फ़ोन बंद और चालू करने के बाद उपयोगकर्ता सभी अनुस्मारक खो देगा।
class BootReceiver : BroadcastReceiver() {
override fun onReceive(
context: Context,
intent: Intent
) {
if (intent.action ==
Intent.ACTION_BOOT_COMPLETED
) {
val prefs =
context.getSharedPreferences("alarms", 0)
val savedTime =
prefs.getLong("next_alarm", 0L)
if (savedTime > System.currentTimeMillis()) {
scheduleReminder(context, savedTime)
}
}
}
}
व्यवहार में, AlarmManager अलार्म घड़ी एप्लिकेशन, कैलेंडर, दवा अनुस्मारक और किसी भी कार्य के लिए सबसे अच्छा समाधान बना हुआ है जहां निष्पादन का समय उपयोगकर्ता के लिए महत्वपूर्ण है। अन्य सभी पृष्ठभूमि कार्य परिदृश्यों के लिए, WorkManager या JobScheduler को प्राथमिकता दी जाती है।
AlarmManager और WorkManager के बीच चयन करते समय, इस नियम का पालन करें: यदि उपयोगकर्ता ने स्पष्ट रूप से दोपहर 2:30 बजे याद दिलाने के लिए कहा — तो setAlarmClock के साथ AlarmManager का उपयोग करें। यदि कार्य को “लगभग एक बार प्रति घंटे” निष्पादित होना चाहिए — PeriodicWorkRequest के साथ WorkManager अधिक ऊर्जा-कुशल और विश्वसनीय होगा।
अक्सर पूछे जाने वाले प्रश्न
दोनों विधियाँ सटीक ट्रिगरिंग सुनिश्चित करती हैं, लेकिन setAlarmClock अतिरिक्त रूप से स्टेटस बार में अलार्म आइकन दिखाता है और सिस्टम को सूचित करता है कि यह एक उपयोगकर्ता अलार्म है। Android 6+, पर setAlarmClock को Doze Mode से प्रतिरक्षा प्राप्त है, जबकि setExact में देरी हो सकती है।
रीबूट के बाद, सभी शेड्यूल किए गए अलार्म रीसेट हो जाते हैं। उन्हें बहाल करने के लिए, आपको BOOT_COMPLETED क्रिया के लिए एक BroadcastReceiver पंजीकृत करना होगा और onReceive में सभी कार्यों को पुनर्निर्धारित करना होगा। इसके बिना, डिवाइस चालू होने के बाद कोई भी अलार्म नहीं चलेगा।
API 19 से, setRepeating गैर-सटीक हो गया है — सिस्टम बिजली बचाने के लिए अंतराल को स्थानांतरित कर सकता है। इसके बजाय, मैन्युअल पुनर्निर्धारण के साथ setExact या PeriodicWorkRequest के साथ WorkManager का उपयोग करें, जो अधिक पूर्वानुमानित व्यवहार प्रदान करता है।
setExact के लिए, SCHEDULE_EXACT_ALARM अनुमति आवश्यक है, जिसे उपयोगकर्ता सेटिंग्स में प्रदान या रद्द कर सकता है। घड़ी इंटरफ़ेस डिस्प्ले के साथ setAlarmClock के लिए, USE_EXACT_ALARM का उपयोग किया जाता है, जो स्टोर से इंस्टॉलेशन पर स्वचालित रूप से दी जाती है।
नहीं, AlarmManager हमेशा PendingIntent के माध्यम से काम करता है। यह BroadcastReceiver के लिए PendingIntent.getBroadcast, Service के लिए PendingIntent.getService, या Activity के लिए PendingIntent.getActivity हो सकता है। PendingIntent के बिना, सिस्टम एप्लिकेशन को ईवेंट वितरित नहीं कर सकता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें