Broadcast Receiver একটি Android উপাদান যা সিস্টেম Broadcast বার্তা শোনে এবং প্রক্রিয়াকরণ করে, যেমন নেটওয়ার্ক অবস্থার পরিবর্তন, ব্যাটারি স্তর, SMS গ্রহণ বা অ্যাপ ইনস্টলেশন। এটি অপারেটিং সিস্টেম দ্বারা ঘটনা ঘটলে চালু হয় এবং মূল থ্রেডে বা পটভূমি পরিষেবার মাধ্যমে তার কাজ সম্পাদন করে। Android Developer Guide, 2026 অনুসারে, Broadcast Receiver অ্যাপ্লিকেশনকে বৈশ্বিক সিস্টেম ইভেন্টে প্রতিক্রিয়া জানাতে দেয় এমনকি এটি চলমান না থাকলেও, যা এটিকে Android ইকোসিস্টেমে পটভূমি ইভেন্ট প্রক্রিয়াকরণের জন্য একটি মূল প্রক্রিয়া করে তোলে।
মূল বিষয়
Broadcast Receiver একটি Android উপাদান যা অপারেটিং সিস্টেম বা অন্যান্য অ্যাপ্লিকেশন দ্বারা বিতরণ করা Intent বার্তা গ্রহণ এবং প্রক্রিয়াকরণের জন্য ডিজাইন করা হয়েছে। Activity এবং Service-এর বিপরীতে, Broadcast Receiver-এর কোনও ব্যবহারকারী ইন্টারফেস নেই — এর কাজ হল ঘটনা ঘটলে একটি সংক্ষিপ্ত কাজ সম্পাদন করা।
Broadcast Receiver Intent প্রক্রিয়ার মাধ্যমে কাজ করে। সিস্টেম বা একটি অ্যাপ্লিকেশন sendBroadcast বা sendOrderedBroadcast-এর মাধ্যমে একটি Intent পাঠায় এবং অপারেটিং সিস্টেম এটি নিবন্ধিত রিসিভারগুলিতে পৌঁছে দেয়। প্রতিটি রিসিভার onReceive পদ্ধতিতে Intent গ্রহণ করে, যা মূল থ্রেডে সম্পাদিত হয়।
Android Compatibility Definition Document অনুসারে, একটি Broadcast Receiver-কে 10 সেকেন্ডের মধ্যে onReceive সম্পূর্ণ করতে হবে — অন্যথায় সিস্টেম এটিকে হ্যাং বলে গণ্য করে এবং প্রক্রিয়াটি শেষ করে। দীর্ঘ পটভূমি কাজের জন্য, রিসিভার থেকে JobScheduler বা WorkManager চালু করুন।
Android দুটি প্রধান ধরনের Broadcast সমর্থন করে: Normal Broadcast এবং Ordered Broadcast। পার্থক্যটি বিতরণের ক্রম এবং প্রক্রিয়াকরণ শৃঙ্খল বাধাগ্রস্ত করার ক্ষমতার মধ্যে রয়েছে। এছাড়াও, Broadcast সিস্টেম (OS দ্বারা উত্পন্ন) এবং কাস্টম (অ্যাপ্লিকেশন দ্বারা তৈরি) এ বিভক্ত।
Normal Broadcast সমস্ত নিবন্ধিত রিসিভারগুলিতে অ্যাসিঙ্ক্রোনাসভাবে এবং নিশ্চিত ক্রম ছাড়া বিতরণ করা হয়। সিস্টেম এই Broadcastগুলি সমান্তরালভাবে প্রক্রিয়া করতে পারে — প্রতিটি রিসিভার নিজস্ব থ্রেডে Intent পায়। Normal Broadcast-এ abortBroadcast কল করার কোনও প্রভাব নেই: অন্যান্য রিসিভারগুলিতে বিতরণ বাতিল করা যায় না।
Ordered Broadcast ক্রমিকভাবে বিতরণ করা হয় — প্রতিটি রিসিভারকে android:priority অ্যাট্রিবিউটের অবরোহী ক্রমে (0 থেকে 999)। প্রক্রিয়াকরণের পরে, রিসিভার setResultExtras-এর মাধ্যমে পরবর্তীটিতে ফলাফল পাঠাতে পারে বা abortBroadcast কল করে শৃঙ্খল বাধাগ্রস্ত করতে পারে। এটি এমন পরিস্থিতিতে ব্যবহৃত হয় যেখানে প্রক্রিয়াকরণের ক্রম গুরুত্বপূর্ণ — উদাহরণস্বরূপ, SMS রিসিভার।
Android অনেক সিস্টেম Broadcast উত্পন্ন করে: ACTION_BOOT_COMPLETED (ডিভাইস বুট), ACTION_BATTERY_LOW, ACTION_POWER_CONNECTED, CONNECTIVITY_ACTION, ACTION_PACKAGE_ADDED এবং অন্যান্য। প্রতিটি Intent-এ Extras-এ অতিরিক্ত ডেটা থাকে — ব্যাটারি স্তর, সংযোগের ধরন, প্যাকেজের নাম।
| Broadcast প্রকার | ক্রম | abortBroadcast | কর্মক্ষমতা |
|---|---|---|---|
| Normal | নিশ্চিত নয় | কাজ করে না | উচ্চ (সমান্তরাল) |
| Ordered | অগ্রাধিকার অনুসারে | কাজ করে | মাঝারি (ক্রমিক) |
| Sticky | একক মান | প্রযোজ্য নয় | নিম্ন (API 21 থেকে অপ্রচলিত) |
Sticky Broadcast একটি অপ্রচলিত ধরন যা শেষ পাঠানো মান সংরক্ষণ করত। পরিবর্তে, সর্বশেষ অবস্থা সংরক্ষণের জন্য LiveData, StateFlow বা ভাগ করা SharedPreferences ব্যবহার করুন।
Broadcast Receiver দুটি উপায়ে নিবন্ধিত করা যেতে পারে: স্থিরভাবে AndroidManifest.xml-এর মাধ্যমে বা গতিশীলভাবে কোডে registerReceiver-এর মাধ্যমে। পছন্দটি পরিস্থিতির উপর নির্ভর করে: স্থির রেজিস্ট্রেশন কাজ করে এমনকি অ্যাপ্লিকেশন চলমান না থাকলেও, গতিশীল রেজিস্ট্রেশন শুধুমাত্র ততক্ষণ কাজ করে যতক্ষণ নিবন্ধনকারী উপাদান সক্রিয় থাকে।
স্থির রেজিস্ট্রেশন ম্যানিফেস্টে <receiver> ট্যাগ দিয়ে <application>-এর ভিতরে ঘোষণা করা হয়। প্রতিটি রিসিভারের জন্য, হ্যান্ডলার ক্লাস এবং ইন্টারসেপ্ট করার জন্য ক্রিয়া সহ একটি Intent ফিল্টার নির্দিষ্ট করা হয়। সিস্টেম Broadcast ঘটলে এই রিসিভারগুলি লোড করে এমনকি অ্যাপ্লিকেশন চলমান না থাকলেও।
<!-- Static Broadcast Receiver registration in manifest -->
<receiver android:name=".BootReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
গতিশীল রেজিস্ট্রেশন Activity, Service বা Fragment কোডে registerReceiver পদ্ধতি ব্যবহার করে সম্পাদিত হয়। রিসিভার কেবল ততক্ষণ বেঁচে থাকে যতক্ষণ এটি নিবন্ধনকারী উপাদানটি বেঁচে থাকে। onPause বা onDestroy-এ সর্বদা unregisterReceiver কল করুন — অন্যথায় মেমরি লিক হয় এবং সিস্টেম প্রক্রিয়াটি শেষ করতে পারে।
Ordered Broadcast-এর জন্য, বিতরণের ক্রম android:priority অ্যাট্রিবিউট দ্বারা নির্ধারিত হয়। উচ্চ অগ্রাধিকারযুক্ত রিসিভার প্রথমে Intent পায়। যদি এটি প্রক্রিয়াকরণের পরে abortBroadcast কল করে, তবে কম অগ্রাধিকারযুক্ত রিসিভারগুলি Intent পাবে না। স্থির রিসিভারগুলির জন্য, ম্যানিফেস্টের Intent ফিল্টারে অগ্রাধিকার সেট করা হয়।
Ordered Broadcast-এর রিসিভারগুলি setResultExtras বা setResultData-এর মাধ্যমে শৃঙ্খলে পরবর্তীটিতে ডেটা পাঠাতে পারে। এটি পাইপলাইন প্রক্রিয়াকরণের অনুমতি দেয়: প্রথম রিসিভার Intent-কে অতিরিক্ত ডেটা দিয়ে সমৃদ্ধ করে, দ্বিতীয়টি এটি ব্যবহার করে, তৃতীয়টি শৃঙ্খল সম্পূর্ণ করে। getResultExtras পদ্ধতি পূর্ববর্তী রিসিভার দ্বারা পাঠানো ডেটা পড়ে।
Normal Broadcast-এর জন্য, ক্রম নিশ্চিত নয়, তাই সমস্ত রিসিভার অপরিবর্তিত মূল Intent পায়। যদি আপনার প্রয়োজন হয় যে রিসিভারগুলি একে অপরকে প্রভাবিত করুক, তাহলে sendBroadcast-এর পরিবর্তে sendOrderedBroadcast ব্যবহার করুন।
Android 8 (API 26, Oreo) পটভূমি Broadcast-এ গুরুত্বপূর্ণ সীমাবদ্ধতা প্রবর্তন করেছে। বেশিরভাগ অন্তর্নিহিত Broadcast — যেগুলি কোনও নির্দিষ্ট অ্যাপ্লিকেশনকে সম্বোধন করা নয় — স্থির রেজিস্ট্রেশনের সাথে আর কাজ করে না। সিস্টেম CONNECTIVITY_ACTION বা ACTION_BATTERY_LOW-এর মতো ক্রিয়াগুলির জন্য ম্যানিফেস্টে নিবন্ধিত রিসিভারগুলিকে ব্লক করে।
Google স্থির রেজিস্ট্রেশনের সাথে কাজ চালিয়ে যাওয়া Broadcast-গুলির একটি তালিকা স্থির করেছে: BOOT_COMPLETED, TIME_TICK, Alarm এবং প্যাকেজ পরিবর্তন — মোট প্রায় এক ডজন ব্যতিক্রম। অন্যান্য সমস্ত অন্তর্নিহিত Broadcast-এর এখন Context.registerReceiver-এর মাধ্যমে গতিশীল রেজিস্ট্রেশন প্রয়োজন, যা কেবল তখন কাজ করে যখন অ্যাপ অগ্রভাগে থাকে।
পটভূমি কাজের জন্য যা আগে Broadcast Receiver-এর মাধ্যমে পরিচালনা করা হত, Android WorkManager (নির্বাহের গ্যারান্টি সহ বিলম্বিত কাজ), JobScheduler (ডিভাইস অবস্থা বিবেচনা করে পর্যায়ক্রমিক কাজ) এবং NotificationListenerService (বিজ্ঞপ্তি পর্যবেক্ষণ) সুপারিশ করে। এই উপাদানগুলি Android 8 সীমাবদ্ধতা ছাড়া কাজ করে এবং শক্তি খরচের জন্য অপ্টিমাইজ করা।
আসুন নেটওয়ার্ক সংযোগ ট্র্যাক করার জন্য একটি Broadcast Receiver তৈরি করি। রিসিভার CONNECTIVITY_ACTION Broadcast ক্যাপচার করবে এবং সংযোগের ধরন লগ করবে। Android 8+-এর জন্য, আমরা এটি গতিশীলভাবে নিবন্ধন করব কারণ এটি একটি অন্তর্নিহিত Broadcast যা স্থির রেজিস্ট্রেশন থেকে বাদ।
// নেটওয়ার্ক অবস্থা ট্র্যাকিংয়ের জন্য Broadcast Receiver
class NetworkReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val network = cm.activeNetwork
val caps = cm.getNetworkCapabilities(network)
val connectionType = when {
caps?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) == true -> "WiFi"
caps?.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == true -> "Cellular"
else -> "Disconnected"
}
Log.d("NetworkReceiver", "সংযোগের ধরন: $connectionType")
}
}
// Activity-তে গতিশীল রেজিস্ট্রেশন
class MainActivity : AppCompatActivity() {
private val networkReceiver = NetworkReceiver()
override fun onStart() {
super.onStart()
val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
registerReceiver(networkReceiver, filter)
}
override fun onStop() {
super.onStop()
unregisterReceiver(networkReceiver)
}
}
সর্বদা onStop-এ রিসিভারের রেজিস্ট্রেশন বাতিল করুন — যদি Activity পটভূমিতে চলে যায় কিন্তু রিসিভার নিবন্ধিত থাকে, সিস্টেম সম্পদ মুক্ত করতে পারে না। Service-এর জন্য, onDestroy ব্যবহার করুন। ফ্র্যাগমেন্টে, ফ্র্যাগমেন্টের জীবনচক্র অনুসরণ করে onStart-এ রিসিভার নিবন্ধন করুন এবং onStop-এ রেজিস্ট্রেশন বাতিল করুন।
সচরাচর জিজ্ঞাসা
Broadcast Receiver সিস্টেম এবং কাস্টম Broadcast বার্তা প্রক্রিয়াকরণের জন্য একটি Android উপাদান। এটি onReceive পদ্ধতিতে Intent গ্রহণ করে, যা মূল থ্রেডে চলে এবং 10 সেকেন্ডের মধ্যে সম্পূর্ণ হতে হবে। দীর্ঘ কাজের জন্য, WorkManager বা JobScheduler ব্যবহার করুন।
Normal Broadcast সমস্ত রিসিভারকে অ্যাসিঙ্ক্রোনাস এবং সমান্তরালভাবে বিতরণ করা হয় — ক্রম নিশ্চিত নয়, abortBroadcast কাজ করে না। Ordered Broadcast অগ্রাধিকার অনুসারে ক্রমিকভাবে বিতরণ করা হয়, প্রতিটি রিসিভার শৃঙ্খল বাধাগ্রস্ত করতে পারে বা setResultExtras-এর মাধ্যমে পরবর্তীটিতে ডেটা পাঠাতে পারে।
স্থির রেজিস্ট্রেশন (ম্যানিফেস্টে) রিসিভারকে কাজ করতে দেয় এমনকি অ্যাপ্লিকেশন চলমান না থাকলেও। গতিশীল রেজিস্ট্রেশন (registerReceiver-এর মাধ্যমে) কেবল ততক্ষণ কাজ করে যতক্ষণ নিবন্ধনকারী উপাদান সক্রিয় থাকে। Android 8 থেকে শুরু করে, অনেক অন্তর্নিহিত Broadcast-এর গতিশীল রেজিস্ট্রেশন প্রয়োজন।
Android 8 (API 26) বেশিরভাগ অন্তর্নিহিত Broadcast-এর জন্য স্থির রেজিস্ট্রেশন নিষিদ্ধ করেছে, যেমন CONNECTIVITY_ACTION বা ACTION_BATTERY_LOW। ব্যতিক্রমগুলির মধ্যে BOOT_COMPLETED, Alarm, সময় এবং কিছু অন্যান্য অন্তর্ভুক্ত। পটভূমি কাজের জন্য, Broadcast-এর পরিবর্তে WorkManager ব্যবহার করুন।
onReceive থেকে UI-তে ডেটা পাঠাতে LiveData, StateFlow, EventBus বা LocalBroadcastManager ব্যবহার করুন। onReceive থেকে সরাসরি UI আপডেট করার চেষ্টা করবেন না — এটি মূল থ্রেডে চলে, কিন্তু রিসিভার গ্যারান্টি দেয় না যে Activity দৃশ্যমান। LocalBroadcastManager অভ্যন্তরীণ যোগাযোগের জন্য একটি অপ্রচলিত বিকল্প।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন