কম্পিউটার টিউটোরিয়াল

Broadcast Receivers 습득: নেটওয়ার্ক পরিবর্তন শনাক্ত করার Новиস গাইড

মান लीजिए আপনার একটি অ্যাপ্লিকেশন আছে যা একটি স্থির ইন্টারনেট সংযোগের ওপর নির্ভরশীল। আপনি চান আপনার অ্যাপ্লিকেশনটি ইন্টারনেট সংযোগ পরিবর্তন হলে বিজ্ঞপ্তি পায়। আপনি কীভাবে করবেন? একটি সম্ভাব্য সমাধান হচ্ছে একটি সার্ভিস যা সবসময় ইন্টারনেট সংযোগ চেক করে। এই ইমপ্লিমেন্টেশন বিভিন্ন কারণে খারাপ তাই আমরা এটিকে বিবেচনা করবো না। এই সমস্যার সমাধান হচ্ছে একটি Broadcast Receiver এবং এটি আপনি যা বলবেন সেটির পরিবর্তন শোনবে। একটি ব্রডকাস্ট রিসিভার আপনার অ্যাপ্লিকেশনের স্ট্যাটাস যাই হোক, সবসময় একটি ব্রডকাস্টের জন্য বিজ্ঞপ্তি পাবে। এটি কোনো মানে রাখে না আপনার অ্যাপ্লিকেশন বর্তমানে চলছে, ব্যাকগ্রাউন্ডে আছে, বা вообще চলছে না।

পটভূমি

ব্রডকাস্ট রিসিভারগুলো আপনার Android অ্যাপ্লিকেশনের কম্পোনেন্ট যারা ব্রডকাস্ট মেসেজ (অথবা ইভেন্ট) বিভিন্ন আউটলেট থেকে শোনে:

  • অন্য অ্যাপ্লিকেশন থেকে
  • সিস্টেম নিজেই থেকে
  • আপনার নিজের অ্যাপ্লিকেশন থেকে

অর্থাৎ, সেগুলো আহ্বান করা হয় যখন একটি নির্দিষ্ট অ্যাকশন ঘটে যেগুলো শোনার জন্য সেগুলো প্রোগ্রাম করা হয়েছে (যেমন, একটি ব্রডকাস্ট)।

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

  • একটি ইম্পলিসিট ব্রডকাস্ট হল সেটি যা আপনার অ্যাপ্লিকেশনকে নির্দিষ্টভাবে টার্গেট করে না তাই এটি আপনার অ্যাপ্লিকেশনের এক্সক্লूसিভ নয়। একটিতে রেজিস্টার করার জন্য, আপনাকে একটি IntentFilter ব্যবহার করতে হবে এবং আপনার ম্যানিফেস্টে ডিক্লেয়ার করতে হবে। আপনাকে এই সব করতে হবে কারণ Android অপারেটিং সিস্টেম আপনার ম্যানিফেস্টে ডিক্লেয়ার করা সকল ইন্টেন্ট ফিল্টার চেক করে এবং দেখে কোনো ম্যাচ আছে কিনা। এই আচরণের কারণে, ইম্পলিসিট ব্রডকাস্টগুলোর টার্গেট অ্যাট্রিবিউট নেই। একটি ইম্পলিসিট ব্রডকাস্টের উদাহরণ হবে ইনকামিং SMS মেসেজের অ্যাকশন।
  • একটি এক্সপ্লিসিট ব্রডকাস্ট হল সেটি যা আপনার অ্যাপ্লিকেশনের জন্য নির্দিষ্টভাবে টার্গেট করা হয়েছে একটি কম্পোনেন্টে যা আগে থেকে পরিচিত। এটি টার্গেট অ্যাট্রিবিউটের কারণে হয় যেটি অ্যাপ্লিকেশনের প্যাকেজ নাম বা একটি কম্পোনেন্ট ক্লাস নাম ধারণ করে।

একটি রিসিভার ডিক্লেয়ার করার দুটি পদ্ধতি রয়েছে:

  1. আপনার AndroidManifest.xml ফাইলে <receiver> ট্যাগ দিয়ে একটি ডিক্লেয়ার করে (ওকে স্ট্যাটিক বলা হয়)
<receiver android:name=".YourBrodcastReceiverClass" android:exported="true"> <intent-filter> <!-- The actions you wish to listen to, below is an example --> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>
AndroidManifest.xml

আপনি লক্ষ্য করবেন উপরে ডিক্লেয়ার করা ব্রডকাস্ট রিসিভারের একটি প্রপার্টি রয়েছে exported=”true”। এই অ্যাট্রিবিউট রিসিভারকে বলে যে এটি অ্যাপ্লিকেশনের স্কোপের বাইর থেকে ব্রডকাস্ট রিসিভ করতে পারে।

২. অথবা ডাইনামিক্যালি registerReceiver দিয়ে একটি ইনস্ট্যান্স রেজিস্টার করে (যাকে কনটেক্সট রেজিস্টারড বলা হয়)

public abstract Intent registerReceiver (BroadcastReceiver receiver, IntentFilter filter);

ইমপ্লিমেন্টেশন

আপনার নিজস্ব ব্রডকাস্ট রিসিভার তৈরি করতে, আপনাকে প্রথমে BroadcastReceiver পেরেন্ট ক্লাস এক্সটেন্ড করতে হবে এবং বাধ্যতামূলক মেথড, onReceive ওভাররাইড করতে হবে:

public void onReceive(Context context, Intent intent) { //Implement your logic here }

সব কিছু একসাথে দিলে:

public class MyBroadcastReceiver extends BroadcastReceiver { @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(); Toast.makeText(context, log, Toast.LENGTH_LONG).show(); } }
MyBroadcastReceiver.java
⚠️The onReceive method runs on the main thread, and because of this, its execution should be brief.

যদি একটি দীর্ঘ প্রসেস এক্সিকিউট করা হয়, সিস্টেম মেথড রিটার্ন করার পর প্রসেসটি কিল করে দিতে পারে। এটিকে এড়াতে, goAsync ব্যবহার করুন বা একটি জব শিডিউল করুন। জব শিডিউল করার বিষয়ে আরও পড়ুন এই নিবন্ধের নিচে।

ডাইনামিক রেজিস্ট্রেশন উদাহরণ

একটি কনটেক্সটের সাথে একটি রিসিভার রেজিস্টার করতে, আপনাকে প্রথমে আপনার ব্রডকাস্ট রিসিভারের একটি ইনস্ট্যান্স ইনস্ট্যানশিয়েট করতে হবে:

BroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();

তারপর, আপনি নির্দিষ্ট কনটেক্সটের উপর নির্ভর করে এটি রেজিস্টার করতে পারেন:

IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); this.registerReceiver(myBroadcastReceiver, filter);
IntentFilter-এর জন্য প্রথম প্যারামিটার একটি স্ট্রিং যা একটি অ্যাকশন রিপ্রেজেন্ট করে

আপনার ব্রডকাস্ট রিসিভার আনরেজিস্টার করা ভুলবেন না যখন আপনার এটি আর দরকার নেই

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

একটি ইভেন্ট ব্রডকাস্ট করা

আপনার অ্যাপ্লিকেশন থেকে ব্রডকাস্ট মেসেজ পাঠানোর পয়েন্ট হল আপনার অ্যাপ্লিকেশনকে এর ভিতরে ঘট रही ইভেন্টগুলোর সাথে রেসপন্স করার অনুমতি দেওয়া। একটি সিনেরিও চিন্তা করুন যেখানে কোডের একটি অংশে, ব্যবহারকারী একটি নির্দিষ্ট অ্যাকশন সম্পাদন করে এবং তার ফলাফলস্বরূপ, আপনি অন্য জায়গায় আপনার লজিক এক্সিকিউট করতে চান।

ব্রডকাস্ট পাঠানোর তিনটি পদ্ধতি রয়েছে:

  1. sendOrderedBroadcast মেথড, শুধু একবারে একটি রিসিভারে ব্রডকাস্ট পাঠাতে নিশ্চিত করে। প্রতিটি ব্রডকাস্ট সেটির পরেরটিতে ডেটা পাস করতে পারে, অথবা রিসিভারদের সেকোয়েন্সে ব্রডকাস্ট প্রপাগেশন বন্ধ করতে পারে
  2. sendBroadcast উপরের মেথডের সাথে সাদৃশ্য, একটি পার্থক্য সহ। সব ব্রডকাস্ট রিসিভার মেসেজ পায় এবং একে অপরের ওপর ডিপেন্ড করে না
  3. LocalBroadcastManager.sendBroadcast মেথড শুধু আপনার অ্যাপ্লিকেশনের ভিতরে ডিফাইন করা রিসিভারদের ব্রডকাস্ট পাঠায় এবং আপনার অ্যাপ্লিকেশনের স্কোপ ছাড়িয়ে যায় না।কাস্টম ব্রডকাস্ট পাঠানোর উদাহরণ

https://giphy.com/gifs/23gUJhHyWkXEwl7UYV/html5

Broadcast Receivers 습득: নেটওয়ার্ক পরিবর্তন শনাক্ত করার Новиস গাইড
Photo by John Gibbons on Unsplash

গটচাস এবং লক্ষ্য রাখার বিষয়

  • ইম্পলিসিট ব্রডকাস্টের মাধ্যমে সংবেদনশীল ডেটা পাঠাবেন না, কারণ যেকোনো অ্যাপ্লিকেশন যা সেটি শোনার জন্য লিসেন করছে, সেটি পাবে। আপনি এটিকে যেনো একটি প্যাকেজ স্পেসিফাই করে অথবা ব্রডকাস্টের সাথে একটি পারমিশন অ্যাটাচ করে প্রতিরোধ করতে পারেন
  • একটি রিসিভড ব্রডকাস্ট থেকে এক্টিভিটি স্টার্ট করবেন না কারণ ইউজার এক্সপেরিয়েন্স খারাপ। বরং একটি নোটিফিকেশন ডিসপ্লে করতে চান।

নিচের বুলেট পয়েন্টগুলো ব্রডকাস্ট রিসিভারে পরিবর্তনগুলোর ओर ইঙ্গিত করে যা প্রতিটি Android OS সংস্করণের জন্য প্রাসঙ্গিক (7.0 থেকে শুরু)। প্রতিটি সংস্করণের জন্য, কিছু সীমাবদ্ধতা লাগু হয়েছে এবং আচরণও পরিবর্তন হয়েছে। ব্রডকাস্ট রিসিভার ব্যবহার করার সময় এই সীমাবদ্ধতাগুলো মনে রাখুন।

  • 7.0 এবং উপরে (API level 24) - দুটি সিস্টেম ব্রডকাস্ট ডিজেবল করা হয়েছে, Action_New_Picture এবং Action_New_Video (কিন্তু Android O-তে রেজিস্টারড রিসিভারের জন্য সেগুলো ফেরত এনেছে)
  • 8.0 এবং উপরে (API level 26) - অধিকাংশ ইম্পলিসিট ব্রডকাস্ট ডাইনামিক্যালি রেজিস্টার করতে হবে এবং স্ট্যাটিক্যালি নয় (আপনার ম্যানিফেস্টে)। আপনি যে ব্রডকাস্টগুলো হোয়াইটলিস্টেড করা হয়েছে সেগুলো এই লিঙ্কে পাবেন।
  • 9.0 এবং উপরে (API level 28) - Wi-Fi সিস্টেম ব্রডকাস্ট এবং Network_State_Changed_Action-এ কম ইনফোর্মেশন রিসিভ করা যায়।

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

ব্রডকাস্ট রিসিভারের বিকল্প

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

  • LocalBroadcastManager - যেমন আমি উপরে বলেছি, এটি শুধু আপনার অ্যাপ্লিকেশনের ভিতরের ব্রডকাস্টের জন্য বৈধ
  • একটি জব শিডিউল করা - একটি জব একটি সিগন্যাল বা ট্রিগার রিসিভ করার ওপর নির্ভর করে রান করা যেতে পারে, তাই আপনি কখনও কখনও পাবেন যে আপনি যে ব্রডকাস্ট শোনছিলেন সেটিকে একটি জব দ্বারা রিপ্লেস করা যায়। এছাড়া, JobScheduler, আপনার জব ফিনিশ হবে তা গ্যারান্টি দেবে, কিন্তু সেটি বিভিন্ন সিস্টেম ফ্যাক্টর (টাইম এবং কন্ডিশন) বিবেচনা করে সেটি কখন রান করা উচিত সেটি নির্ধারণ করবে। একটি জব তৈরি করার সময়, আপনি onStartJob নামক একটি মেথড ওভাররাইড করবেন। এই মেথড মেইন থ্রেডে রান করে, তাই নিশ্চিত করুন যে এটি সীমিত সময়ে কাজটি ফিনিশ করে। আপনি যদি জটিল লজিক পারফর্ম করতে চান, তবে একটি ব্যাকগ্রাউন্ড টাস্ক শুরু করার কথা বিবেচনা করুন। এছাড়া, এই মেথডের রিটার্ন মান হল একটি বুলিয়ান, যেখানে true ডেনোট করে যে কিছু অ্যাকশন এখনো পারফর্ম হচ্ছে, এবং false মানে জবটি ডন।

আপনি যদি ব্রডকাস্ট রিসিভারের আনন্দ এবং বিস্ময় প্রথম হাতে অনুভব করতে চান, তবে এই লিঙ্কগুলো ফলো করতে পারেন যে আমি সেট আপ করেছি:

  1. কাস্টম ব্রডকাস্ট (ম্যানিফেস্ট ডিক্লেরেশনের সাথে)
  2. ব্রডকাস্ট রেজিস্টার করা (ম্যানিফেস্টে ডিক্লেয়ার না করে)
  3. LocalBroadcastManager

ব্রডকাস্ট শেষ।


  1. শুরুর রস্পবেরি পাই প্রজেক্টগুলো যা শিক্ষার্থীদের জন্য সহজ

  2. শুরুতكير জন্য মাইক্রোসফট এক্সেল টিউটোরিয়াল

  3. Microsoft PowerPoint 초보자 튜토리얼

  4. নতুন MacBook Pro ব্যবহারকারীদের জন্য ১০টি অপরিহার্য টিপস