How Broadcast Receivers works( ব্রডকাস্ট রিসিভার কিভাবে কাজ করে )

ছোটবেলা থেকেই ক্রিকেট খেলা পছন্দ করতাম। স্কুল অথবা কোচিং ফাঁকি দিয়ে প্রচুর খেলা দেখতাম। তখন থেকেই একটা শব্দ এর সাথে পরিচিত হই, সেটা হচ্ছে টিভি ব্রডকাস্ট। যার বাংলা অর্থ হচ্ছে টিভি সম্প্রচার


অ্যান্ড্রয়েড অ্যাপ ডেভেলপমেন্ট শিখার সময় ব্রডকাস্ট রিসিভার টপিক এর নাম শুনে আমার মাথায় ঘুরে ফিরে একটাই প্রশ্ন আসতো, এইটা কি কোনভাবে ক্রিকেট এর টিভি ব্রডকাস্ট এর সাথে সম্পর্কিত ? আমার অনুসন্ধিসুক মাইন্ড এর একটা অনুবাদও করে ফেলেছিল। Broadcast অর্থ সম্প্রচার, আর Receiver অর্থ যে কোন কিছু গ্রহণ করে। অর্থাৎ Broadcast Receivers হল কোন কিছুর সম্প্রচার যে গ্রহণ করে

অনুবাদ টা মোটেও ফেলে দেয়ার মতো না। বরং পুরোপুরি Broadcast Receivers এর ধারণাকে সমর্থন করে। এখন আসা যাক মূল টপিকে।

ব্রডকাস্ট রিসিভার কি?

আমাদের অ্যান্ড্রয়েড ফোনে বিভিন্ন ধরনের ইভেন্ট সংগঠিত হয়।
অ্যান্ড্রয়েড অপারেটিং সিস্টেম প্রতিনিয়ত নিজে থেকেই এগুলো ব্রডকাস্ট বা সম্প্রচার করে। যেমনঃ ফোনে চার্জ কতটুকু আছে , মেসেজ / কল আসা , ওয়াইফাই কানেক্ট / ডিস-কানেক্ট , চার্জার কানেক্ট / ডিস-কানেক্ট ইত্যাদি। এইসব ইভেন্ট এর উপর ভিত্তি করে আমরা আমাদের অ্যাপে বিভিন্ন ধারণের কাজ করতে পারি। উদাহরণ হিসেবে বলা যায়, শুধুমাত্র ওয়াইফাই কানেক্টেড থাকলেই ডাউনলোড হবে বা ফোনের চার্জ কম থাকলে নোটিফিকেশান দিবে। এইসকল ইভেন্ট কখন ঘটছে সেগুলো জানার জন্য আমাদের একটা রিসিভার লাগবে, যে নির্দিষ্ট ইভেন্টগুলি গ্রহণ করবে এবং আমাদের অ্যাপ কে বলে দিবে, ইভেন্ট টা শুরু হয়েছে এবং তুমি তোমার কাজ করতে পারো। এই রিসিভার টি হচ্ছে ব্রডকাস্ট রিসিভার।

অ্যাপ এ ব্রডকাস্ট রিসিভার এর ব্যবহার

অ্যাপ এ ব্রডকাস্ট রিসিভার ব্যবহার করতে হলে এটিকে রেজিস্টার করতে হবে অর্থাৎ অ্যাপ কে বলে দিতে হবে আমরা কোন ইভেন্ট টি নিয়ে কাজ করবো। রেজিস্টার আমরা দুইভাবে করতে পারি,

1. স্ট্যাটিক 

2. ডায়নামিক 

এই টিউটোরিয়াল এ আমরা স্ট্যাটিক  এবং ডায়নামিক  দুই ধরণের রেজিস্টার কিভাবে করতে হয় সেই সম্পর্কে জানবো। শুরুতে আমরা স্ট্যাটিকভাবে রেজিস্টার করা সম্পর্কে জানবো।

অ্যাপের বর্ণনাঃ

আমরা এমন একটা অ্যাপ বানাতে চাই যার কারনে ফোনে কোনও ম্যাসেজ আসলে আমাদেরকে নোটিফিকেশান দিবে। খুবই সিম্পল তাই না? তাহলে আর কথা না বাড়িয়ে মূল কাজটা শুরু করা যাক।

প্রথমেই আমরা Android Studio তে নিজেদের পছন্দ মতো একটা প্রোজেক্ট তৈরি করে নেবো। আমি নিচে broadcastreceiver নামে একটি প্রোজেক্ট তৈরি করেছি যাতে MainActivity নামে শুধুমাত্র একটি Activity রয়েছে।

শুরুতেই আমরা MyReceiver নামে একটি Class বানিয়ে নিবো এবং MyReceiver ক্লাস কে BroadcastReceiver দ্বারা Extend করবো। Extend করার পর নিচের মতো Error দেখাবে।

Error ঠিক করার জন্য onReceive() Method টি Override করতে হবে।
ব্রডকাস্ট রিসিভারের মূল মেথড হচ্ছে onReceive() । কোন একটি ইভেন্ট ট্রিগার হলেই
onReceive() Method কল হয়। এখন আমরা এই Method এর মধ্যে আমাদের প্রয়োজন মতো কোড লিখবো।

যেহেতু আমরা চাই, আমাদের ফোনে এসএমএস এলে অ্যাপ যেন আমাদেরকে নোটিফিকেশান দেয় তাই আমরা onReceive() Method এর মধ্যে নোটিফিকেশান এর জন্য নিচের মতো কোড লিখবো।

  @Override
    public void onReceive(Context context, Intent intent) {

        NotificationManager notificationManager= (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

        int notificationId = 100;
        String channelId = "channel-01";
        String channelName = "Channel Name";

// check whether the device Version OREO or not
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            int importance = NotificationManager.IMPORTANCE_HIGH;
            NotificationChannel mChannel = new NotificationChannel(
                    channelId, channelName, importance);
            notificationManager.createNotificationChannel(mChannel);
        }
//for Notification sound........
        Uri Sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        
// for Notifications
        NotificationCompat.Builder builder= new NotificationCompat.Builder(context,channelId)
                .setSmallIcon(R.drawable.logo)
                .setContentTitle("Broadcast Receiver Demo")
                .setContentText("SMS Received")
                .setPriority(Notification.PRIORITY_HIGH)
                .setSound(Sound)
                .setAutoCancel(true);

        notificationManager.notify(notificationId,builder.build());

    }

নোটিফিকেশান সেট করার আগে আমরা কিছু অতিরিক্ত কোড লিখেছি , Channel ID তৈরি করার জন্য। Android Verson OREO অথবা উপরের দিকের ভার্শনগুলোতে নোটিফিকেশান এর জন্য Channel ID তৈরি করে নিতে হয়। না হলে ওইসব ভার্শনের ডিভাইস গুলোতে নোটিফিকেশান Show করবে না।

ব্যাস আমদের কাজ এখন শেষ। এখন শুধু broadcastreceiver টি রেজিস্টার করার পালা। ব্রডকাস্ট রিসিভারটি রেজিস্টার করার জন্য AndroidManifest.xml ফাইলের ভিতরে নিচের মতো করে Code লিখবো।

যেহেতু আমরা এসএমএস ইভেন্ট নিয়ে কাজ করছি, তাই
intent-filter এর মধ্যে “android.provider.Telephony.SMS_RECEIVED” লিখে দিতে হবে । অন্য কোন ইভেন্ট নিয়ে কাজ করে শুধুমাত্র উপরের অংশটুকু পরিবর্তন হবে। নিচে কিছু ইভেন্ট এর নাম এবং intent-filter দেওয়া হল,

ইভেন্টযে কারণে ঘটে
android.intent.action.BATTERY_LOW
ব্যাটারি পাওয়ার কম থাকলে
android.intent.action.BOOT_COMPLETED
ফোন রিস্টার্ট করলে
android.intent.action.DEVICE_STORAGE_LOW
মেমরি কম থাকলে
android.intent.action.AIRPLANE_MODE
ফোন এরোপ্লেন মোড এ থাকলে

যেহেতু আমরা এসএমএস নিয়ে কাজ করবো তাই আমাদের কে অ্যাপ থেকে এর জন্য পারমিশন নিয়ে নিতে হবে।

<uses-permission android:name=”android.permission.RECEIVE_MMS”></uses-permission>

আমাদের সব কাজ শেষ। এবার প্রোজেক্ট টি রান করি। ফোনে যখন কোন এসএমএস আসবে, সাথে সাথে আপটি নোটিফিকেশান দিবে। ফোনে এসএমএস আসার অপেক্ষা না করে ইমুলেটর দিয়ে এসএমএস পাঠিয়ে অ্যাপ টি টেস্ট করতে পারি।

এতক্ষণ আমরা ব্রডকাস্ট রিসিভার কিভাবে স্ট্যাটিক ভাবে ডিক্লেয়ার করা যায় তা দেখলাম। এখন দেখবো ডায়নামিক ভাবে। তার আগে আমদের জানতে হবে আমরা কেন
ডায়নামিক ভাবে ব্রডকাস্ট রিসিভার রেজিস্টার করবো ?

আমরা হয়তো চাইনা আমাদের অ্যাপ সবসময় এসএমএস আসলে নোটিফিকেশান দিক। অনেক সময় ইউজার রেজিস্ট্রেশন সময় OTP (One Time Password) পাঠানো হয়। আমরা চাই শুধুমাত্র ঐ সময় আমাদেরকে অ্যাপ নোটিফিকেশান দিক। এর জন্য আমদের ব্রডকাস্ট রিসিভার কে ডায়নামিক ভাবে রেজিস্টার করতে হবে।

ডায়নামিক ভাবে ব্রডকাস্ট রিসিভার রেজিস্টার

ডায়নামিক নাম শুনে মনে হচ্ছে প্রচুর কোড করতে হবে।আসলে ভয় পাবার কিছুই নাই। আমাদেরকে দুইটা কাজ করতে হবে।

  1. AndroidManifest.xml এর রেসিভার ভেতর থেকে intent-filter সরিয়ে ফেলতে হবে।
  2. MainActivity তে ব্রডকাস্ট রিসিভার   রেজিস্টার করে হবে।
public class MainActivity extends AppCompatActivity {

    private MyReceiver myReceiver;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myReceiver=new MyReceiver();

    }

    @Override
    protected void onStart() {
        super.onStart();
        IntentFilter intentFilter=new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
        registerReceiver(myReceiver,intentFilter);

    }

    @Override
    protected void onStop() {
        super.onStop();
        unregisterReceiver(myReceiver);

    }
}

MainActivity তে শুরুতেই আমরা MyReceiver এর একটা অবজেক্ট নিবো এবং এটিকে Initailize করে নিবো।

তারপর onStart() এবং onStop নামে দুইটা মেথড Override করতে হবে। মেথড দুইটা কে কল করতে হয় না। Android System নিজে থেকেই কল করে। অ্যাপ স্টার্ট হবার পড় onStart() মেথড কল হয়। আমরা এই মেথড এর মধ্যেই আমাদের ব্রডকাস্ট রিসিভারটি নিচের মতো করে রেজিস্টার করবো। IntentFilter এর মধ্যে আমরা আমাদের প্রয়োজনীয় ইভেন্ট টি বলে দিয়েছি।

    @Override
    protected void onStart() {
        super.onStart();
        IntentFilter intentFilter=new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
        registerReceiver(myReceiver,intentFilter);

    }

অ্যাপ থেকে বেরিয়ে গেলে আমাদের ইভেন্ট টি যেন কাজ না করে এজন্য ব্রডকাস্ট রিসিভার টি আন-রেজিস্টার করতে হবে। আন-রেজিস্টার করার জন্য আমরা onStop() মেথড এর মধ্যে নিচের মতো কোড লিখবো।

    @Override
    protected void onStop() {
        super.onStop();
        unregisterReceiver(myReceiver);

    }

ব্যাস আমাদের কাজ শেষ। ব্রডকাস্ট রিসিভার শেখা হয়ে গেলো। এই প্রোজেক্ট এর সম্পূর্ণ কোড পাওয়া যাবে http://www.akter.me