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 অনুমতির প্রয়োজন হয় না। সময়-গুরুত্বপূর্ণ কাজের (সকাল ৭টায় অ্যালার্ম) জন্য, 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-এর মধ্যে নির্বাচন করার সময়, এই নিয়মটি অনুসরণ করুন: যদি ব্যবহারকারী স্পষ্টভাবে বিকাল ২:৩০টায় মনে করাতে বলেন — তাহলে 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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন