Intent Filter হল AndroidManifest.xml-এ একটি ঘোষণামূলক বিবৃতি যা সিস্টেমকে জানায় যে অ্যাপ্লিকেশনের কোন কম্পোনেন্ট কোন অন্তর্নিহিত অভিপ্রায় (implicit intent) প্রক্রিয়া করতে পারে। Android Developer Guide অনুসারে, ফিল্টারে action, category এবং data থাকে, যার ভিত্তিতে সিস্টেম অন্যান্য অ্যাপ্লিকেশন এবং সিস্টেম ইভেন্ট থেকে কল রুট করে। Android ডেভেলপমেন্ট বিভিন্ন অ্যাপ্লিকেশনের কম্পোনেন্টের মধ্যে দুর্বল সংযোগের প্রধান প্রক্রিয়া হিসেবে Intent Filter ব্যবহার করে।
মূল পয়েন্ট
Intent Filter হল একটি Android অ্যাপ্লিকেশনের কনফিগারেশন উপাদান যা সিস্টেমকে নির্দিষ্ট ধরনের অন্তর্নিহিত অভিপ্রায় প্রক্রিয়া করার কম্পোনেন্টের ক্ষমতা সম্পর্কে জানায়। স্পষ্ট Intents-এর বিপরীতে যা একটি নির্দিষ্ট ক্লাস নির্দিষ্ট করে, অন্তর্নিহিত Intents-এ শুধুমাত্র প্রয়োজনীয় কাজের বিবরণ থাকে এবং সিস্টেম নিজেই নিবন্ধিত ফিল্টারের ভিত্তিতে উপযুক্ত কম্পোনেন্ট খুঁজে পায়।
ফিল্টারগুলি AndroidManifest.xml ফাইলে একটি কম্পোনেন্ট — Activity, Service বা BroadcastReceiver — এর ভিতরে ঘোষণা করা হয়। প্রতিটি ফিল্টারে একাধিক action, category এবং data উপাদান থাকতে পারে। একটি কম্পোনেন্টে সীমাহীন সংখ্যক Intent Filter থাকতে পারে, প্রতিটি একটি পৃথক প্রক্রিয়াকরণ পরিস্থিতি বর্ণনা করে।
Intent Filter অ্যাপ্লিকেশন কম্পোনেন্টের মধ্যে দুর্বল সংযোগ নীতি বাস্তবায়ন করে। অ্যাপ্লিকেশন A-কে অ্যাপ্লিকেশন B-এর অস্তিত্ব সম্পর্কে জানার প্রয়োজন নেই — এটি কেবল কাজের বিবরণ সহ একটি Intent পাঠায়, এবং সিস্টেম ফিল্টারের ভিত্তিতে এটি রুট করে। এই প্রক্রিয়াটি Share Sheet, ব্রাউজার নির্বাচন এবং ডিপ লিঙ্ক প্রক্রিয়াকরণের ভিত্তি।
স্পষ্ট Intents চালু করার জন্য একটি নির্দিষ্ট কম্পোনেন্ট ক্লাস নির্দিষ্ট করে। এগুলি একটি একক অ্যাপ্লিকেশনের ভিতরে অভ্যন্তরীণ নেভিগেশনের জন্য ব্যবহৃত হয় যখন ডেভেলপার জানেন ঠিক কোন Activity খোলা উচিত। অন্তর্নিহিত Intents-এ শুধুমাত্র একটি কাজের বিবরণ থাকে এবং কম্পোনেন্ট সিস্টেম দ্বারা গতিশীলভাবে নির্ধারিত হয়।
Intent Filter একচেটিয়াভাবে অন্তর্নিহিত Intents-এর সাথে কাজ করে। যদি কোনো Intent একটি নির্দিষ্ট ক্লাস নির্দিষ্ট করে, সিস্টেম সমস্ত ফিল্টার উপেক্ষা করে এবং সরাসরি নির্দিষ্ট কম্পোনেন্ট চালু করে। ফিল্টারগুলি কেবল অন্তর্নিহিত কল সমাধান করার সময় পরীক্ষা করা হয়, যা তাদের আন্তঃঅ্যাপ্লিকেশন মিথস্ক্রিয়ার একটি মূল উপাদান করে তোলে।
| বৈশিষ্ট্য | স্পষ্ট Intent | অন্তর্নিহিত Intent |
|---|---|---|
| কম্পোনেন্ট | স্পষ্টভাবে নির্দিষ্ট (className) | সিস্টেম দ্বারা নির্ধারিত |
| Intent Filter | প্রয়োজন নেই | প্রয়োজন |
| উদাহরণ | startActivity(Intent(this, ProfileActivity::class.java)) | Intent(ACTION_VIEW, Uri.parse(”https://example.com”)) |
| নিরাপত্তা | উচ্চ (কোনো বাধা নেই) | নিম্ন (সম্ভাব্য দ্বন্দ্ব) |
প্রতিটি Intent Filter তিনটি গ্রুপের উপাদান নিয়ে গঠিত — action, category এবং data — যাদের সংমিশ্রণ নির্ধারণ করে যে কম্পোনেন্ট কোন Intents পাবে। একটি ফিল্টার পূর্ণ বলে বিবেচিত হয় যদি Intent প্রতিটি গ্রুপের অন্তত একটি উপাদানের সাথে মেলে।
Action সম্পাদিত কাজটি বর্ণনা করে — দেখা, সম্পাদনা, পাঠানো। Category অতিরিক্ত প্রক্রিয়াকরণ প্রসঙ্গ যোগ করে — উদাহরণস্বরূপ, ব্রাউজার থেকে চালু করার ক্ষমতা। Data URI বা MIME টাইপের মাধ্যমে প্রক্রিয়াকৃত তথ্যের বিন্যাস সংজ্ঞায়িত করে।
ব্যবহারকারী প্রোফাইলের লিঙ্ক খোলার জন্য একটি Activity-এর জন্য Intent Filter-এর উদাহরণ। ফিল্টারটিতে সঠিক রাউটিংয়ের জন্য তিনটি গ্রুপের উপাদান অন্তর্ভুক্ত রয়েছে।
<activity android:name=".ProfileActivity">
<intent-filter>
<action
android:name="android.intent.action.VIEW" />
<category
android:name="android.intent.category.DEFAULT" />
<category
android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="myapp"
android:host="profile" />
</intent-filter>
</activity>
category DEFAULT-এর বাধ্যতামূলক উল্লেখ লক্ষ্য করুন — এটি ছাড়া সিস্টেম কম্পোনেন্টে অন্তর্নিহিত Intents পাঠাবে না। BROWSABLE বিভাগ যোগ করা হয় যদি লিঙ্কটি ব্রাউজার থেকে প্রক্রিয়া করা উচিত।
Android-এ একটি ডিপ লিঙ্ক action VIEW এবং স্কিম, হোস্ট এবং পাথ সম্বলিত data ট্যাগ সহ Intent Filter-এর মাধ্যমে কনফিগার করা হয়। myapp://profile/42-এর মতো লিঙ্ক অনুসরণ করলে, সিস্টেম মিলিত ফিল্টার সহ একটি Activity খুঁজে পায় এবং পাস করা URI সহ এটি চালু করে। সঠিক মিলের জন্য pathPrefix, pathPattern বা path সঠিকভাবে কনফিগার করা গুরুত্বপূর্ণ।
Android 6 (API 23) থেকে শুরু করে, App Links-এর জন্য সমর্থন যোগ করা হয়েছে — HTTPS-এর মাধ্যমে যাচাইকৃত ডিপ লিঙ্ক। App Links একই Intent Filter ব্যবহার করে কিন্তু Digital Asset Links-এর মাধ্যমে অতিরিক্ত ডোমেন যাচাইকরণ সহ। যাচাইকরণের পরে, সিস্টেম নির্বাচন ডায়ালগ ছাড়াই স্বয়ংক্রিয়ভাবে অ্যাপ্লিকেশন খুলে।
HTTPS লিঙ্কের মাধ্যমে যাচাইকরণ সহ App Link-এর জন্য ফিল্টারের উদাহরণ। এই ক্ষেত্রে স্কিম সর্বদা https এবং হোস্ট Digital Asset Links-এ নির্দিষ্ট ডোমেনের সাথে মেলে।
<intent-filter android:autoVerify="true">
<action
android:name="android.intent.action.VIEW" />
<category
android:name="android.intent.category.DEFAULT" />
<category
android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="example.com"
android:pathPrefix="/profile" />
</intent-filter>
autoVerify বৈশিষ্ট্য সিস্টেমকে জানায় যে অ্যাপ্লিকেশন ইনস্টল করার সময় Digital Asset Links পরীক্ষা করতে। যদি যাচাইকরণ সফলভাবে পাস হয়, অ্যাপ্লিকেশনটি স্বয়ংক্রিয়ভাবে নির্দিষ্ট ডোমেন এবং পাথের জন্য ডিফল্ট হ্যান্ডলার হয়ে যায়।
সিস্টেম Intent প্রক্রিয়া করার জন্য একটি কম্পোনেন্ট নির্বাচন করার পরে, ডেভেলপারকে টার্গেট কম্পোনেন্টের ভিতরে আগত intent থেকে ডেটা বের করতে হবে। Activity-র জন্য, onCreate()-এ getIntent() পদ্ধতি ব্যবহার করা হয়; BroadcastReceiver-এর জন্য, onReceive() পদ্ধতি ব্যবহার করা হয়, যেখানে Intent প্যারামিটার হিসাবে পাস করা হয়।
ডেটা নিষ্কাশনে অপারেশনের ধরন নির্ধারণের জন্য action, URI-র জন্য data এবং অতিরিক্ত তথ্যের জন্য extra প্যারামিটার পাওয়া অন্তর্ভুক্ত। এই উপাদানগুলির প্রতিটি অনুপস্থিত থাকতে পারে, তাই ব্যবহারের আগে null পরীক্ষা বাধ্যতামূলক।
Kotlin-এ Activity-তে আগত ডিপ লিঙ্ক প্রক্রিয়াকরণের উদাহরণ। কোডটি Intent থেকে URI বের করে এবং হোস্ট এবং পাথের ভিত্তিতে নেভিগেশন সিদ্ধান্ত নেয়।
class ProfileActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val uri = intent?.data
if (uri?.host == "profile") {
val userId = uri.lastPathSegment
loadProfile(userId)
}
}
}
intent এবং data null-এর জন্য পরীক্ষা করতে safe call operator ব্যবহার করার সুপারিশ করা হয়, কারণ অ্যাক্টিভিটি আগত ডিপ লিঙ্ক ছাড়াই চালু হতে পারে। নেভিগেশনে ব্যবহার করার আগে host এবং pathSegment null-এর জন্য পরীক্ষা করা উচিত।
যদি একাধিক অ্যাপ্লিকেশন একই অন্তর্নিহিত Intent-এর সাথে মিলিত Intent Filter নিবন্ধন করে থাকে, সিস্টেম ব্যবহারকারীকে একটি নির্বাচন ডায়ালগ দেখায়। ব্যবহারকারী এককালীন ব্যবহারের জন্য একটি অ্যাপ্লিকেশন নির্বাচন করতে পারেন বা একটি ডিফল্ট হ্যান্ডলার সেট করতে পারেন। Android 10 থেকে শুরু করে, নির্বাচন ডায়ালগ শুধুমাত্র প্রথম কলেই দেখানো হয়, তারপরে সিস্টেম ব্যবহারকারীর পছন্দ মনে রাখে।
অগ্রাধিকার পরিচালনার জন্য, intent-filter ট্যাগে android:priority বৈশিষ্ট্য ব্যবহার করা হয়। মান যত বেশি, দ্বন্দ্ব সমাধানে কম্পোনেন্টের অগ্রাধিকার তত বেশি। তবে, অগ্রাধিকার বিভিন্ন অ্যাপ্লিকেশনের ফিল্টারের জন্য কাজ করে না — এই ক্ষেত্রে, সর্বদা একটি নির্বাচন ডায়ালগ দেখানো হয় যদি কোনো অ্যাপ্লিকেশন ডিফল্ট হিসাবে সেট না থাকে।
ডেভেলপার Intent.createChooser()-এর মাধ্যমে প্রোগ্রাম্যাটিকভাবে নির্বাচন ডায়ালগ কল করতে পারেন, টার্গেট Intent এবং একটি শিরোনাম পাস করে। এটি তখন কার্যকর যখন অ্যাপ্লিকেশন ব্যবহারকারীকে স্পষ্টভাবে একটি হ্যান্ডলার বেছে নেওয়ার প্রস্তাব দিতে চায়, এমনকি যদি একটি ডিফল্ট অ্যাপ্লিকেশন সেট করা থাকে। উদাহরণস্বরূপ, ACTION_SEND-এর মাধ্যমে সোশ্যাল নেটওয়ার্কে ছবি পাঠানোর সময় createChooser-এর সাথে ডিফল্ট সেটিংস নির্বিশেষে ডায়ালগ দেখানোর নিশ্চয়তা দেয়।
সবচেয়ে সাধারণ ভুলগুলির মধ্যে একটি হল Intent Filter-এ DEFAULT বিভাগের অনুপস্থিতি। ডেভেলপাররা উদাহরণ থেকে কনফিগারেশন কপি করেন কিন্তু এই বিভাগটি যোগ করতে ভুলে যান, ফলে Activity অন্তর্নিহিত Intents পায় না। সিস্টেম অন্তর্নিহিত কলের জন্য ফিল্টার দেখতে পায় না, যদিও স্পষ্ট Intents কাজ করতে থাকে।
দ্বিতীয় সাধারণ ভুল হল সম্পূর্ণ URI ছাড়া data ট্যাগে scheme-এর ভুল উল্লেখ। যদি শুধুমাত্র স্কিম নির্দিষ্ট করা হয় কিন্তু হোস্ট না হয়, ফিল্টারটি যেকোনো উৎস থেকে এই স্কিম সহ সমস্ত লিঙ্ক গ্রহণ করবে, যা অবিশ্বস্ত উৎস থেকে অনাকাঙ্ক্ষিত কলের কারণ হতে পারে। কমপক্ষে scheme এবং host সর্বদা নির্দিষ্ট করার সুপারিশ করা হয়।
তৃতীয় ভুল হল Activity কোডে intent.data-এর null পরীক্ষার অনুপস্থিতি। যদি Activity ডিপ লিঙ্কের মাধ্যমে নয় বরং লঞ্চার থেকে সাধারণ উপায়ে চালু হয়, Intent-এ URI থাকে না। পরীক্ষা ছাড়া intent.data অ্যাক্সেস করলে NullPointerException হয় এবং অ্যাপ্লিকেশন ক্র্যাশ করে। safe call অপারেটরের সাথে সর্বদা intent?.data?.toString() ব্যবহার করুন।
সচরাচর জিজ্ঞাসা
হ্যাঁ, অন্তর্নিহিত Intents পাওয়ার জন্য DEFAULT বিভাগ বাধ্যতামূলক। এটি ছাড়া, সিস্টেম কম্পোনেন্টে অন্তর্নিহিত কল পাঠাবে না, এবং Intent Filter কেবল স্পষ্ট Intents-এর জন্য কাজ করবে, যা যাইহোক ফিল্টার পরীক্ষা করে না।
কোনো সীমা নেই। একটি Activity-তে যেকোনো সংখ্যক Intent Filter থাকতে পারে। প্রতিটি ফিল্টার একটি পৃথক প্রক্রিয়াকরণ পরিস্থিতি বর্ণনা করে, উদাহরণস্বরূপ একটি ফিল্টার ডিপ লিঙ্কের জন্য, অন্যটি ফাইল প্রক্রিয়াকরণের জন্য, তৃতীয়টি Share Sheet-এর জন্য।
Intent Filter হল অন্তর্নিহিত Intents প্রক্রিয়া করার জন্য একটি সাধারণ প্রক্রিয়া। App Link হল Digital Asset Links-এর মাধ্যমে যাচাইকরণ সহ Intent Filter-এর একটি বিশেষ ক্ষেত্র, যা স্বয়ংক্রিয়ভাবে নির্দিষ্ট ডোমেনে HTTPS লিঙ্কের জন্য অ্যাপ্লিকেশনকে ডিফল্ট হ্যান্ডলার হিসেবে নিয়োগ করে।
হ্যাঁ, Intent Filter শুধুমাত্র Activity-র জন্য নয়, Service এবং BroadcastReceiver-এর জন্যও ঘোষণা করা যেতে পারে। Service-এর জন্য এটি অন্যান্য অ্যাপ্লিকেশন থেকে ব্যাকগ্রাউন্ড সার্ভিস চালানোর অনুমতি দেয়, BroadcastReceiver-এর জন্য — সিস্টেম ব্রডকাস্ট বার্তা গ্রহণের অনুমতি দেয়।
MIME টাইপ data ট্যাগে mimeType বৈশিষ্ট্যের মাধ্যমে নির্দিষ্ট করা হয়। ফিল্টার নির্ধারণ করে যে কম্পোনেন্ট কী ধরনের ডেটা প্রক্রিয়া করতে পারে — উদাহরণস্বরূপ, সব ছবির জন্য image/* বা শুধুমাত্র সরল পাঠ্যের জন্য text/plain। MIME টাইপগুলি URI স্কিমের সাথে একত্রিত করা যেতে পারে।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন