সম্প্রচার ওভারভিউ

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

সিস্টেমটি সর্বোত্তম সিস্টেমের স্বাস্থ্য বজায় রাখার জন্য সম্প্রচারের বিতরণকে অপ্টিমাইজ করে। অতএব, সম্প্রচারের ডেলিভারি সময় নিশ্চিত করা হয় না। যে অ্যাপগুলির জন্য কম লেটেন্সি ইন্টারপ্রসেস যোগাযোগের প্রয়োজন তাদের আবদ্ধ পরিষেবাগুলি বিবেচনা করা উচিত৷

অ্যাপগুলি নির্দিষ্ট সম্প্রচার পেতে নিবন্ধন করতে পারে। যখন একটি সম্প্রচার পাঠানো হয়, সিস্টেম স্বয়ংক্রিয়ভাবে সেই বিশেষ ধরনের সম্প্রচার পাওয়ার জন্য সদস্যতা নেওয়া অ্যাপগুলিতে সম্প্রচার রুট করে।

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

সিস্টেম সম্প্রচার সম্পর্কে

সিস্টেম স্বয়ংক্রিয়ভাবে সম্প্রচার পাঠায় যখন বিভিন্ন সিস্টেম ইভেন্ট ঘটে, যেমন যখন সিস্টেমটি বিমান মোডের মধ্যে এবং বাইরে চলে যায়। সিস্টেম সম্প্রচারগুলি ইভেন্টটি পাওয়ার জন্য সদস্যতা নেওয়া সমস্ত অ্যাপগুলিতে পাঠানো হয়৷

সম্প্রচার বার্তাটি নিজেই একটি Intent অবজেক্টে মোড়ানো থাকে যার অ্যাকশন স্ট্রিং ঘটনাটি সনাক্ত করে (উদাহরণস্বরূপ android.intent.action.AIRPLANE_MODE )। অভিপ্রায় এছাড়াও অতিরিক্ত তথ্য অন্তর্ভুক্ত করতে পারে তার অতিরিক্ত ক্ষেত্রে বান্ডিল. উদাহরণস্বরূপ, বিমান মোড অভিপ্রায় একটি বুলিয়ান অতিরিক্ত অন্তর্ভুক্ত করে যা নির্দেশ করে যে বিমান মোড চালু আছে কিনা।

কীভাবে ইন্টেন্টগুলি পড়তে হয় এবং একটি অভিপ্রায় থেকে অ্যাকশন স্ট্রিং পেতে হয় সে সম্পর্কে আরও তথ্যের জন্য, ইন্টেন্ট এবং ইনটেন্ট ফিল্টারগুলি দেখুন।

সিস্টেম সম্প্রচার ক্রিয়াগুলির একটি সম্পূর্ণ তালিকার জন্য, Android SDK-এ BROADCAST_ACTIONS.TXT ফাইলটি দেখুন৷ প্রতিটি সম্প্রচার কর্মের সাথে একটি ধ্রুবক ক্ষেত্র যুক্ত থাকে। উদাহরণস্বরূপ, ধ্রুবক ACTION_AIRPLANE_MODE_CHANGED এর মান হল android.intent.action.AIRPLANE_MODE । প্রতিটি সম্প্রচার কর্মের জন্য ডকুমেন্টেশন তার সংশ্লিষ্ট ধ্রুবক ক্ষেত্রে উপলব্ধ।

সিস্টেম সম্প্রচারে পরিবর্তন

অ্যান্ড্রয়েড প্ল্যাটফর্ম বিকশিত হওয়ার সাথে সাথে এটি পর্যায়ক্রমে সিস্টেম সম্প্রচারের আচরণ পরিবর্তন করে। Android এর সমস্ত সংস্করণ সমর্থন করার জন্য নিম্নলিখিত পরিবর্তনগুলি মনে রাখবেন৷

অ্যান্ড্রয়েড 14

অ্যাপ্লিকেশানগুলি ক্যাশে থাকা অবস্থায়, সম্প্রচার বিতরণ সিস্টেমের স্বাস্থ্যের জন্য অপ্টিমাইজ করা হয়৷ উদাহরণস্বরূপ, কম গুরুত্বপূর্ণ সিস্টেম সম্প্রচার যেমন ACTION_SCREEN_ON অ্যাপটি ক্যাশে থাকা অবস্থায় পিছিয়ে যায়৷ একবার অ্যাপটি ক্যাশ করা অবস্থা থেকে একটি সক্রিয় প্রক্রিয়া লাইফসাইকেলে চলে গেলে, সিস্টেমটি যেকোনো বিলম্বিত সম্প্রচার সরবরাহ করে।

ম্যানিফেস্টে ঘোষিত গুরুত্বপূর্ণ সম্প্রচারগুলি অস্থায়ীভাবে ডেলিভারির জন্য ক্যাশে করা অবস্থা থেকে অ্যাপগুলিকে সরিয়ে দেয়৷

অ্যান্ড্রয়েড 9

Android 9 (API স্তর 28) দিয়ে শুরু করে, NETWORK_STATE_CHANGED_ACTION সম্প্রচার ব্যবহারকারীর অবস্থান বা ব্যক্তিগতভাবে শনাক্তযোগ্য ডেটা সম্পর্কে তথ্য পায় না।

উপরন্তু, যদি আপনার অ্যাপটি Android 9 বা উচ্চতর সংস্করণে চালিত কোনো ডিভাইসে ইনস্টল করা থাকে, তাহলে Wi-Fi থেকে সিস্টেম ব্রডকাস্টে SSID, BSSID, সংযোগের তথ্য বা স্ক্যান ফলাফল থাকে না। এই তথ্য পেতে, পরিবর্তে getConnectionInfo() কল করুন।

অ্যান্ড্রয়েড 8.0

অ্যান্ড্রয়েড 8.0 (API স্তর 26) দিয়ে শুরু করে, সিস্টেমটি ম্যানিফেস্ট-ঘোষিত রিসিভারের উপর অতিরিক্ত বিধিনিষেধ আরোপ করে।

যদি আপনার অ্যাপ্লিকেশানটি Android 8.0 বা উচ্চতরকে লক্ষ্য করে, আপনি সর্বাধিক অন্তর্নিহিত সম্প্রচারের জন্য একটি রিসিভার ঘোষণা করতে ম্যানিফেস্ট ব্যবহার করতে পারবেন না (সম্প্রচার যেগুলি আপনার অ্যাপকে বিশেষভাবে লক্ষ্য করে না)৷ ব্যবহারকারী যখন সক্রিয়ভাবে আপনার অ্যাপ ব্যবহার করছেন তখনও আপনি একটি প্রসঙ্গ-নিবন্ধিত রিসিভার ব্যবহার করতে পারেন।

অ্যান্ড্রয়েড 7.0

Android 7.0 (API স্তর 24) এবং উচ্চতর নিম্নলিখিত সিস্টেম সম্প্রচার পাঠায় না:

এছাড়াও, অ্যান্ড্রয়েড 7.0 এবং উচ্চতরকে লক্ষ্য করে এমন অ্যাপগুলিকে অবশ্যই CONNECTIVITY_ACTION সম্প্রচারটি registerReceiver(BroadcastReceiver, IntentFilter) ব্যবহার করে নিবন্ধন করতে হবে৷ ম্যানিফেস্টে রিসিভার ঘোষণা করা কাজ করে না।

সম্প্রচার গ্রহণ

অ্যাপ দুটি উপায়ে সম্প্রচার গ্রহণ করতে পারে: ম্যানিফেস্ট-ঘোষিত রিসিভার এবং প্রসঙ্গ-নিবন্ধিত রিসিভারের মাধ্যমে।

ম্যানিফেস্ট-ঘোষিত রিসিভার

আপনি যদি আপনার ম্যানিফেস্টে একটি ব্রডকাস্ট রিসিভার ঘোষণা করেন, তাহলে সম্প্রচার পাঠানো হলে সিস্টেমটি আপনার অ্যাপটি চালু করে (যদি অ্যাপটি ইতিমধ্যে চালু না থাকে)।

ম্যানিফেস্টে একটি সম্প্রচার রিসিভার ঘোষণা করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন:

  1. আপনার অ্যাপের ম্যানিফেস্টে <receiver> উপাদানটি নির্দিষ্ট করুন।

    <!-- If this receiver listens for broadcasts sent from the system or from
         other apps, even other apps that you own, set android:exported to "true". -->
    <receiver android:name=".MyBroadcastReceiver" android:exported="false">
        <intent-filter>
            <action android:name="APP_SPECIFIC_BROADCAST" />
        </intent-filter>
    </receiver>

    অভিপ্রায় ফিল্টারগুলি আপনার রিসিভার সাবস্ক্রাইব করা সম্প্রচার ক্রিয়াগুলি নির্দিষ্ট করে৷

  2. সাবক্লাস BroadcastReceiver এবং onReceive(Context, Intent) প্রয়োগ করুন। নিম্নলিখিত উদাহরণে সম্প্রচার রিসিভার লগ করে এবং সম্প্রচারের বিষয়বস্তু প্রদর্শন করে:

    কোটলিন

    private const val TAG = "MyBroadcastReceiver"
    
    class MyBroadcastReceiver : BroadcastReceiver() {
    
        override fun onReceive(context: Context, intent: Intent) {
            StringBuilder().apply {
                append("Action: ${intent.action}\n")
                append("URI: ${intent.toUri(Intent.URI_INTENT_SCHEME)}\n")
                toString().also { log ->
                    Log.d(TAG, log)
    
                    val binding = ActivityNameBinding.inflate(layoutInflater)
                    val view = binding.root
                    setContentView(view)
    
                    Snackbar.make(view, log, Snackbar.LENGTH_LONG).show()
                }
            }
        }
    }

    জাভা

    public class MyBroadcastReceiver extends BroadcastReceiver {
            private static final String TAG = "MyBroadcastReceiver";
            @Override
            public void onReceive(Context context, Intent intent) {
                StringBuilder sb = new StringBuilder();
                sb.append("Action: " + intent.getAction() + "\n");
                sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME).toString() + "\n");
                String log = sb.toString();
                Log.d(TAG, log);
    
                ActivityNameBinding binding =
                        ActivityNameBinding.inflate(layoutInflater);
                val view = binding.root;
                setContentView(view);
    
                Snackbar.make(view, log, Snackbar.LENGTH_LONG).show();
            }
        }

    ভিউ বাইন্ডিং সক্ষম করতে, আপনার মডিউল-স্তরের build.gradle ফাইলে viewBinding কনফিগার করুন

অ্যাপটি ইনস্টল করা হলে সিস্টেম প্যাকেজ ম্যানেজার রিসিভার নিবন্ধন করে। রিসিভার তারপরে আপনার অ্যাপে একটি পৃথক এন্ট্রি পয়েন্ট হয়ে যায় যার অর্থ সিস্টেমটি অ্যাপটি শুরু করতে পারে এবং অ্যাপটি বর্তমানে চালু না থাকলে সম্প্রচার সরবরাহ করতে পারে।

সিস্টেমটি একটি নতুন BroadcastReceiver কম্পোনেন্ট অবজেক্ট তৈরি করে যা এটি প্রাপ্ত প্রতিটি সম্প্রচার পরিচালনা করে। এই বস্তুটি শুধুমাত্র onReceive(Context, Intent) কলের সময়কালের জন্য বৈধ। একবার আপনার কোডটি এই পদ্ধতি থেকে ফিরে আসলে, সিস্টেম বিবেচনা করে যে উপাদানটি আর সক্রিয় থাকবে না।

প্রসঙ্গ-নিবন্ধিত রিসিভার

প্রসঙ্গ-নিবন্ধিত রিসিভাররা সম্প্রচার গ্রহণ করে যতক্ষণ না তাদের নিবন্ধনের প্রসঙ্গ বৈধ থাকে। উদাহরণ স্বরূপ, আপনি যদি কোনো Activity প্রেক্ষাপটে নিবন্ধন করেন, যতক্ষণ পর্যন্ত কার্যকলাপটি ধ্বংস না হয় ততক্ষণ পর্যন্ত আপনি সম্প্রচার পাবেন। আপনি যদি অ্যাপ্লিকেশন প্রসঙ্গে নিবন্ধন করেন, আপনি যতক্ষণ অ্যাপটি চলছে ততক্ষণ আপনি সম্প্রচার পাবেন।

একটি প্রসঙ্গ সহ একটি রিসিভার নিবন্ধন করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন:

  1. আপনার অ্যাপের মডিউল-স্তরের বিল্ড ফাইলে, AndroidX কোর লাইব্রেরির 1.9.0 বা উচ্চতর সংস্করণ অন্তর্ভুক্ত করুন:

    গ্রোভি

    dependencies {
        def core_version = "1.13.1"
    
        // Java language implementation
        implementation "androidx.core:core:$core_version"
        // Kotlin
        implementation "androidx.core:core-ktx:$core_version"
    
        // To use RoleManagerCompat
        implementation "androidx.core:core-role:1.0.0"
    
        // To use the Animator APIs
        implementation "androidx.core:core-animation:1.0.0"
        // To test the Animator APIs
        androidTestImplementation "androidx.core:core-animation-testing:1.0.0"
    
        // Optional - To enable APIs that query the performance characteristics of GMS devices.
        implementation "androidx.core:core-performance:1.0.0"
    
        // Optional - to use ShortcutManagerCompat to donate shortcuts to be used by Google
        implementation "androidx.core:core-google-shortcuts:1.1.0"
    
        // Optional - to support backwards compatibility of RemoteViews
        implementation "androidx.core:core-remoteviews:1.1.0"
    
        // Optional - APIs for SplashScreen, including compatibility helpers on devices prior Android 12
        implementation "androidx.core:core-splashscreen:1.2.0-alpha02"
    }

    কোটলিন

    dependencies {
        val core_version = "1.13.1"
    
        // Java language implementation
        implementation("androidx.core:core:$core_version")
        // Kotlin
        implementation("androidx.core:core-ktx:$core_version")
    
        // To use RoleManagerCompat
        implementation("androidx.core:core-role:1.0.0")
    
        // To use the Animator APIs
        implementation("androidx.core:core-animation:1.0.0")
        // To test the Animator APIs
        androidTestImplementation("androidx.core:core-animation-testing:1.0.0")
    
        // Optional - To enable APIs that query the performance characteristics of GMS devices.
        implementation("androidx.core:core-performance:1.0.0")
    
        // Optional - to use ShortcutManagerCompat to donate shortcuts to be used by Google
        implementation("androidx.core:core-google-shortcuts:1.1.0")
    
        // Optional - to support backwards compatibility of RemoteViews
        implementation("androidx.core:core-remoteviews:1.1.0")
    
        // Optional - APIs for SplashScreen, including compatibility helpers on devices prior Android 12
        implementation("androidx.core:core-splashscreen:1.2.0-alpha02")
    }
  2. BroadcastReceiver এর একটি উদাহরণ তৈরি করুন:

    কোটলিন

    val br: BroadcastReceiver = MyBroadcastReceiver()

    জাভা

    BroadcastReceiver br = new MyBroadcastReceiver();
  3. IntentFilter এর একটি উদাহরণ তৈরি করুন:

    কোটলিন

    val filter = IntentFilter(APP_SPECIFIC_BROADCAST)

    জাভা

    IntentFilter filter = new IntentFilter(APP_SPECIFIC_BROADCAST);
  4. ব্রডকাস্ট রিসিভার রপ্তানি করা উচিত এবং ডিভাইসের অন্যান্য অ্যাপে দৃশ্যমান হবে কিনা তা বেছে নিন। যদি এই রিসিভারটি সিস্টেম থেকে বা অন্য অ্যাপ থেকে পাঠানো সম্প্রচার শুনতে থাকে-এমনকি আপনার মালিকানাধীন অন্যান্য অ্যাপও- RECEIVER_EXPORTED পতাকা ব্যবহার করুন। পরিবর্তে যদি এই রিসিভার শুধুমাত্র আপনার অ্যাপের মাধ্যমে পাঠানো সম্প্রচারের জন্য শুনছে, তাহলে RECEIVER_NOT_EXPORTED পতাকা ব্যবহার করুন।

    কোটলিন

    val listenToBroadcastsFromOtherApps = false
    val receiverFlags = if (listenToBroadcastsFromOtherApps) {
        ContextCompat.RECEIVER_EXPORTED
    } else {
        ContextCompat.RECEIVER_NOT_EXPORTED
    }

    জাভা

    boolean listenToBroadcastsFromOtherApps = false;
    if (listenToBroadcastsFromOtherApps) {
        receiverFlags = ContextCompat.RECEIVER_EXPORTED;
    } else {
        receiverFlags = ContextCompat.RECEIVER_NOT_EXPORTED;
    }
  5. registerReceiver() কল করে রিসিভার নিবন্ধন করুন:

    কোটলিন

    ContextCompat.registerReceiver(context, br, filter, receiverFlags)

    জাভা

    ContextCompat.registerReceiver(context, br, filter, receiverFlags);
  6. সম্প্রচার গ্রহণ বন্ধ করতে, unregisterReceiver(android.content.BroadcastReceiver) কল করুন। আপনার আর প্রয়োজন না হলে বা প্রসঙ্গটি আর বৈধ না থাকলে রিসিভারটিকে নিবন্ধনমুক্ত করতে ভুলবেন না।

    আপনি যেখানে রিসিভার রেজিস্টার এবং আনরেজিস্টার করবেন সে বিষয়ে সচেতন থাকুন, উদাহরণস্বরূপ, যদি আপনি কার্যকলাপের প্রসঙ্গ ব্যবহার করে onCreate(Bundle) এ একটি রিসিভার রেজিস্টার করেন, তাহলে আপনার উচিত onDestroy() এ রিসিভারটিকে অ্যাক্টিভিটি প্রেক্ষাপট থেকে ফাঁস হওয়া রোধ করতে। আপনি যদি onResume() এ কোনো রিসিভার নিবন্ধন করেন, তাহলে একাধিকবার নিবন্ধন না করার জন্য আপনাকে onPause() এ নিবন্ধনমুক্ত করতে হবে (যদি আপনি বিরতি দেওয়ার সময় সম্প্রচার গ্রহণ করতে না চান, এবং এটি অপ্রয়োজনীয় সিস্টেমের ওভারহেড কমিয়ে দিতে পারে)। onSaveInstanceState(Bundle) এ নিবন্ধনমুক্ত করবেন না, কারণ ব্যবহারকারী ইতিহাসের স্ট্যাকে ফিরে গেলে এটি বলা হয় না।

প্রক্রিয়া অবস্থার উপর প্রভাব

আপনার BroadcastReceiver অপারেটিং করছে কি না তা এর অন্তর্ভুক্ত প্রক্রিয়াকে প্রভাবিত করে, যা এর সিস্টেম-হত্যার সম্ভাবনাকে পরিবর্তন করতে পারে। একটি ফোরগ্রাউন্ড প্রক্রিয়া একটি রিসিভারের onReceive() পদ্ধতি চালায়। সিস্টেম চরম মেমরি চাপ ছাড়া প্রক্রিয়া চালায়.

onReceive() এর পরে BroadcastReceiver নিষ্ক্রিয় করা হয়। রিসিভারের হোস্ট প্রক্রিয়াটি তার অ্যাপের উপাদানগুলির মতোই তাৎপর্যপূর্ণ। যদি সেই প্রক্রিয়াটি শুধুমাত্র একটি ম্যানিফেস্ট-ঘোষিত রিসিভার হোস্ট করে (ব্যবহারকারী সম্প্রতি কখনও বা সম্প্রতি ইন্টারঅ্যাক্ট করেনি এমন অ্যাপগুলির জন্য একটি ঘন ঘন ঘটনা), সিস্টেমটি অন্যান্য আরও জটিল প্রক্রিয়াগুলির জন্য সংস্থানগুলি উপলব্ধ করার জন্য onReceive() এর পরে এটিকে মেরে ফেলতে পারে।

সুতরাং, ব্রডকাস্ট রিসিভারদের দীর্ঘ-চলমান ব্যাকগ্রাউন্ড থ্রেডগুলি শুরু করা উচিত নয়। সিস্টেম মেমরি পুনরুদ্ধার করার জন্য onReceive() এর পরে যে কোনো মুহুর্তে প্রক্রিয়াটি বন্ধ করতে পারে, তৈরি থ্রেডটি বন্ধ করে। প্রক্রিয়াটিকে জীবিত রাখতে, JobScheduler ব্যবহার করে রিসিভার থেকে একটি JobService নির্ধারণ করুন যাতে সিস্টেমটি জানে যে প্রক্রিয়াটি এখনও কাজ করছে। পটভূমি কাজের ওভারভিউ আরও বিশদ প্রদান করে।

সম্প্রচার পাঠানো হচ্ছে

অ্যাপ্লিকেশানগুলি সম্প্রচার পাঠানোর জন্য অ্যান্ড্রয়েড তিনটি উপায় সরবরাহ করে:

  • sendOrderedBroadcast(Intent, String) পদ্ধতি একটি সময়ে একটি রিসিভারকে সম্প্রচার পাঠায়। যেহেতু প্রতিটি রিসিভার পালাক্রমে কার্যকর করে, এটি পরবর্তী রিসিভারের কাছে একটি ফলাফল প্রচার করতে পারে, অথবা এটি সম্প্রচারটি সম্পূর্ণরূপে বাতিল করতে পারে যাতে এটি অন্য রিসিভারগুলিতে প্রেরণ করা না হয়। অর্ডার রিসিভারগুলিকে এনড্রয়েড দিয়ে নিয়ন্ত্রণ করা যেতে পারে: ম্যাচিং ইনটেন্ট-ফিল্টারের অগ্রাধিকার বৈশিষ্ট্য; একই অগ্রাধিকার সহ রিসিভার একটি নির্বিচারে চালানো হবে।
  • sendBroadcast(Intent) পদ্ধতি একটি অনির্ধারিত ক্রমে সমস্ত রিসিভারকে সম্প্রচার পাঠায়। এটাকে সাধারণ সম্প্রচার বলা হয়। এটি আরও কার্যকরী, কিন্তু এর মানে হল যে রিসিভাররা অন্য রিসিভারের ফলাফল পড়তে পারে না, সম্প্রচার থেকে প্রাপ্ত ডেটা প্রচার করতে পারে না বা সম্প্রচার বাতিল করতে পারে না।

নিম্নলিখিত কোড স্নিপেট প্রদর্শন করে কিভাবে একটি ইন্টেন্ট তৈরি করে একটি সম্প্রচার পাঠাতে হয় এবং sendBroadcast(Intent) কল করে।

কোটলিন

Intent().also { intent ->
    intent.setAction("com.example.broadcast.MY_NOTIFICATION")
    intent.putExtra("data", "Nothing to see here, move along.")
    sendBroadcast(intent)
}

জাভা

Intent intent = new Intent();
intent.setAction("com.example.broadcast.MY_NOTIFICATION");
intent.putExtra("data", "Nothing to see here, move along.");
sendBroadcast(intent);

সম্প্রচার বার্তাটি একটি Intent বস্তুতে মোড়ানো হয়৷ অভিপ্রায়ের অ্যাকশন স্ট্রিংকে অবশ্যই অ্যাপের জাভা প্যাকেজ নামের সিনট্যাক্স প্রদান করতে হবে এবং সম্প্রচার ইভেন্টটিকে অনন্যভাবে সনাক্ত করতে হবে। আপনি putExtra(String, Bundle) দিয়ে অভিপ্রায়ে অতিরিক্ত তথ্য সংযুক্ত করতে পারেন। আপনি অভিপ্রায় setPackage(String) কল করে একই সংস্থার অ্যাপগুলির একটি সেটে একটি সম্প্রচার সীমাবদ্ধ করতে পারেন।

অনুমতি সহ সম্প্রচার সীমাবদ্ধ করা

অনুমতিগুলি আপনাকে নির্দিষ্ট অনুমতি ধারণ করে এমন অ্যাপগুলির সেটে সম্প্রচার সীমাবদ্ধ করতে দেয়৷ আপনি একটি সম্প্রচারের প্রেরক বা গ্রহণকারীর উপর বিধিনিষেধ প্রয়োগ করতে পারেন৷

অনুমতি নিয়ে পাঠানো হচ্ছে

আপনি যখন sendBroadcast(Intent, String) অথবা sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle) কল করেন, আপনি একটি অনুমতি প্যারামিটার নির্দিষ্ট করতে পারেন। শুধুমাত্র রিসিভার যারা অনুরোধ করেছেন যে অনুমতি সঙ্গে তাদের ম্যানিফেস্টে ট্যাগ (এবং পরবর্তীতে অনুমতি দেওয়া হয়েছে যদি এটি বিপজ্জনক হয়) সম্প্রচার গ্রহণ করতে পারে। উদাহরণস্বরূপ, নিম্নলিখিত কোড একটি সম্প্রচার পাঠায়:

কোটলিন

sendBroadcast(Intent(BluetoothDevice.ACTION_FOUND),
              Manifest.permission.BLUETOOTH_CONNECT)

জাভা

sendBroadcast(new Intent(BluetoothDevice.ACTION_FOUND),
              Manifest.permission.BLUETOOTH_CONNECT)

সম্প্রচার গ্রহণ করার জন্য, গ্রহীতা অ্যাপটিকে অবশ্যই নীচে দেখানো অনুমতির জন্য অনুরোধ করতে হবে:

<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>

আপনি BLUETOOTH_CONNECT এর মতো একটি বিদ্যমান সিস্টেম অনুমতি নির্দিষ্ট করতে পারেন বা <permission> উপাদানের সাথে একটি কাস্টম অনুমতি সংজ্ঞায়িত করতে পারেন। সাধারণভাবে অনুমতি এবং নিরাপত্তা সংক্রান্ত তথ্যের জন্য, সিস্টেম অনুমতি দেখুন।

অনুমতি সহ গ্রহণ

যদি আপনি একটি ব্রডকাস্ট রিসিভার নিবন্ধন করার সময় একটি অনুমতি প্যারামিটার নির্দিষ্ট করেন (হয় registerReceiver(BroadcastReceiver, IntentFilter, String, Handler) অথবা আপনার ম্যানিফেস্টে <receiver> ট্যাগে), তাহলে শুধুমাত্র সম্প্রচারকারীরা যারা <uses-permission> দিয়ে অনুমতির জন্য অনুরোধ করেছেন। তাদের ম্যানিফেস্টে ট্যাগ (এবং পরবর্তীতে এটি বিপজ্জনক হলে অনুমতি দেওয়া হয়েছে) প্রাপকের কাছে একটি অভিপ্রায় পাঠাতে পারে।

উদাহরণ স্বরূপ, অনুমান করুন যে আপনার গ্রহনকারী অ্যাপের একটি ম্যানিফেস্ট-ঘোষিত রিসিভার রয়েছে যা নীচে দেখানো হয়েছে:

<receiver android:name=".MyBroadcastReceiver"
          android:permission="android.permission.BLUETOOTH_CONNECT">
    <intent-filter>
        <action android:name="android.intent.action.ACTION_FOUND"/>
    </intent-filter>
</receiver>

অথবা আপনার গ্রহনকারী অ্যাপের একটি প্রসঙ্গ-নিবন্ধিত রিসিভার রয়েছে যা নীচে দেখানো হয়েছে:

কোটলিন

var filter = IntentFilter(Intent.ACTION_FOUND)
registerReceiver(receiver, filter, Manifest.permission.BLUETOOTH_CONNECT, null )

জাভা

IntentFilter filter = new IntentFilter(Intent.ACTION_FOUND);
registerReceiver(receiver, filter, Manifest.permission.BLUETOOTH_CONNECT, null );

তারপরে, সেই রিসিভারদের সম্প্রচার পাঠাতে সক্ষম হওয়ার জন্য, পাঠানোর অ্যাপটিকে অবশ্যই নীচে দেখানো অনুমতির অনুরোধ করতে হবে:

<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>

নিরাপত্তা বিবেচনা এবং সর্বোত্তম অনুশীলন

সম্প্রচার পাঠানো এবং গ্রহণ করার জন্য এখানে কিছু নিরাপত্তা বিবেচনা এবং সর্বোত্তম অনুশীলন রয়েছে:

  • যদি অনেকগুলি অ্যাপ তাদের ম্যানিফেস্টে একই সম্প্রচার পাওয়ার জন্য নিবন্ধিত থাকে, তাহলে এটি সিস্টেমটিকে অনেকগুলি অ্যাপ চালু করতে পারে, যা ডিভাইসের কার্যক্ষমতা এবং ব্যবহারকারীর অভিজ্ঞতা উভয়ের উপরই যথেষ্ট প্রভাব ফেলতে পারে। এটি এড়াতে, ম্যানিফেস্ট ঘোষণার চেয়ে প্রসঙ্গ নিবন্ধন ব্যবহার করতে পছন্দ করুন। কখনও কখনও, অ্যান্ড্রয়েড সিস্টেম নিজেই প্রসঙ্গ-নিবন্ধিত রিসিভার ব্যবহার করে। উদাহরণস্বরূপ, CONNECTIVITY_ACTION সম্প্রচারটি শুধুমাত্র প্রসঙ্গ-নিবন্ধিত রিসিভারদের কাছে বিতরণ করা হয়৷

  • অন্তর্নিহিত উদ্দেশ্য ব্যবহার করে সংবেদনশীল তথ্য সম্প্রচার করবেন না। সম্প্রচার গ্রহণের জন্য নিবন্ধিত যে কোনো অ্যাপের মাধ্যমে তথ্য পড়তে পারে। কারা আপনার সম্প্রচার গ্রহণ করতে পারে তা নিয়ন্ত্রণ করার তিনটি উপায় রয়েছে:

    • একটি সম্প্রচার পাঠানোর সময় আপনি একটি অনুমতি নির্দিষ্ট করতে পারেন।
    • Android 4.0 এবং উচ্চতর সংস্করণে, আপনি একটি সম্প্রচার পাঠানোর সময় setPackage(String) সহ একটি প্যাকেজ নির্দিষ্ট করতে পারেন। সিস্টেমটি প্যাকেজের সাথে মেলে এমন অ্যাপের সেটে সম্প্রচারকে সীমাবদ্ধ করে।
  • আপনি যখন একটি রিসিভার নিবন্ধন করেন, তখন যেকোনো অ্যাপ আপনার অ্যাপের রিসিভারে সম্ভাব্য দূষিত সম্প্রচার পাঠাতে পারে। আপনার অ্যাপ প্রাপ্ত সম্প্রচারগুলিকে সীমিত করার বিভিন্ন উপায় রয়েছে:

    • একটি সম্প্রচার রিসিভার নিবন্ধন করার সময় আপনি একটি অনুমতি নির্দিষ্ট করতে পারেন।
    • ম্যানিফেস্ট-ঘোষিত রিসিভারের জন্য, আপনি ম্যানিফেস্টে android:exported বৈশিষ্ট্যটিকে "false"-এ সেট করতে পারেন। রিসিভার অ্যাপের বাইরের উৎস থেকে সম্প্রচার গ্রহণ করে না।
  • সম্প্রচার কর্মের জন্য নামস্থান বিশ্বব্যাপী। কর্মের নাম এবং অন্যান্য স্ট্রিংগুলি আপনার মালিকানাধীন একটি নামস্থানে লেখা আছে তা নিশ্চিত করুন, অন্যথায় আপনি অন্য অ্যাপের সাথে অসাবধানতাবশত বিরোধ করতে পারেন।

  • যেহেতু একটি রিসিভারের onReceive(Context, Intent) পদ্ধতিটি মূল থ্রেডে চলে তাই এটি কার্যকর করা উচিত এবং দ্রুত ফিরে আসা উচিত। আপনার যদি দীর্ঘ সময় ধরে কাজ করার প্রয়োজন হয়, তাহলে থ্রেড তৈরি করা বা ব্যাকগ্রাউন্ড পরিষেবা শুরু করার বিষয়ে সতর্ক থাকুন কারণ onReceive() রিটার্ন করার পরে সিস্টেমটি সম্পূর্ণ প্রক্রিয়াটিকে মেরে ফেলতে পারে। আরও তথ্যের জন্য, প্রসেস স্টেটের উপর প্রভাব দেখুন দীর্ঘ সময় ধরে চলমান কাজ সম্পাদন করতে, আমরা সুপারিশ করি:

    • আপনার রিসিভারের onReceive() পদ্ধতিতে goAsync() কল করা এবং একটি পটভূমি থ্রেডে BroadcastReceiver.PendingResult পাস করা। এটি onReceive() থেকে ফিরে আসার পরে সম্প্রচার সক্রিয় রাখে। যাইহোক, এমনকি এই পদ্ধতির সাথেও সিস্টেম আশা করে যে আপনি খুব দ্রুত সম্প্রচার শেষ করবেন (10 সেকেন্ডের কম)। এটি আপনাকে মূল থ্রেডের সমস্যা এড়াতে অন্য থ্রেডে কাজ সরানোর অনুমতি দেয়।
    • JobScheduler এর সাথে একটি কাজের সময় নির্ধারণ করা। আরও তথ্যের জন্য, ইন্টেলিজেন্ট জব শিডিউলিং দেখুন।
  • ব্রডকাস্ট রিসিভার থেকে ক্রিয়াকলাপ শুরু করবেন না কারণ ব্যবহারকারীর অভিজ্ঞতা বিরক্তিকর; বিশেষ করে যদি একাধিক রিসিভার থাকে। পরিবর্তে, একটি বিজ্ঞপ্তি প্রদর্শন বিবেচনা করুন৷