Intent Filter AndroidManifest.xml میں ایک اعلانیہ بیان ہے جو سسٹم کو بتاتا ہے کہ ایپلیکیشن کا کوئی جزو کس مضمر ارادے (implicit intent) کو سنبھال سکتا ہے۔ Android Developer Guide کے مطابق، فلٹر میں action، category اور data شامل ہوتے ہیں، جن کی بنیاد پر سسٹم دوسری ایپلیکیشنز اور سسٹم ایونٹس سے کالز کو روٹ کرتا ہے۔ Android ڈیولپمنٹ مختلف ایپلیکیشنز کے اجزاء کے درمیان کمزور جوڑے (loose coupling) کے بنیادی طریقہ کار کے طور پر Intent Filter استعمال کرتا ہے۔
اہم نکات
Intent Filter ایک Android ایپلیکیشن کا کنفیگریشن عنصر ہے جو سسٹم کو مخصوص قسم کے مضمر ارادوں کو سنبھالنے کے جزو کی صلاحیت کے بارے میں بتاتا ہے۔ واضح Intent کے برعکس جو ایک مخصوص کلاس متعین کرتے ہیں، مضمر Intent میں صرف مطلوبہ عمل کی تفصیل ہوتی ہے، اور سسٹم خود رجسٹرڈ فلٹرز کی بنیاد پر مناسب جزو تلاش کرتا ہے۔
فلٹرز AndroidManifest.xml فائل میں ایک جزو — Activity، Service یا BroadcastReceiver — کے اندر اعلان کیے جاتے ہیں۔ ہر فلٹر میں متعدد action، category اور data عناصر شامل ہو سکتے ہیں۔ ایک جزو میں لامحدود تعداد میں Intent Filter ہو سکتے ہیں، ہر ایک ایک علیحدہ ہینڈلنگ منظرنامے کی وضاحت کرتا ہے۔
Intent Filter ایپلیکیشن کے اجزاء کے درمیان کمزور جوڑے کے اصول کو نافذ کرتا ہے۔ ایپلیکیشن A کو ایپلیکیشن B کے وجود کے بارے میں جاننے کی ضرورت نہیں ہے — یہ صرف عمل کی تفصیل کے ساتھ ایک Intent بھیجتا ہے، اور سسٹم فلٹرز کی بنیاد پر اسے روٹ کرتا ہے۔ یہ طریقہ کار Share Sheet، براؤزر سلیکشن اور ڈیپ لنک ہینڈلنگ کی بنیاد ہے۔
واضح Intent شروع کرنے کے لیے ایک مخصوص جزو کلاس متعین کرتے ہیں۔ یہ ایک ہی ایپلیکیشن کے اندر داخلی نیویگیشن کے لیے استعمال ہوتے ہیں جب ڈیولپر کو بالکل معلوم ہو کہ کون سی Activity کھلنی چاہیے۔ مضمر Intent میں صرف عمل کی تفصیل ہوتی ہے، اور جزو سسٹم کے ذریعے متحرک طور پر متعین کیا جاتا ہے۔
Intent Filter خصوصی طور پر مضمر Intent کے ساتھ کام کرتا ہے۔ اگر 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 — جن کا مجموعہ متعین کرتا ہے کہ جزو کون سے Intent وصول کرے گا۔ ایک فلٹر پورا سمجھا جاتا ہے اگر 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 کی لازمی وضاحت پر توجہ دیں — اس کے بغیر سسٹم جزو کو مضمر Intent منتقل نہیں کرے گا۔ 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 آپریٹر استعمال کرنے کی سفارش کی جاتی ہے، کیونکہ ایکٹیویٹی آنے والے ڈیپ لنک کے بغیر شروع ہو سکتی ہے۔ نیویگیشن میں استعمال کرنے سے پہلے host اور pathSegment کو null کے لیے بھی چیک کرنا چاہیے۔
اگر متعدد ایپلیکیشنز نے ایک ہی مضمر Intent سے مماثل Intent Filter رجسٹر کیا ہے، تو سسٹم صارف کو ایک سلیکشن ڈائیلاگ دکھاتا ہے۔ صارف ایک بار استعمال کے لیے کوئی ایپلیکیشن منتخب کر سکتا ہے یا ڈیفالٹ ہینڈلر متعین کر سکتا ہے۔ Android 10 سے شروع کرتے ہوئے، سلیکشن ڈائیلاگ صرف پہلی کال پر دکھایا جاتا ہے، جس کے بعد سسٹم صارف کے انتخاب کو یاد رکھتا ہے۔
ترجیح کو منظم کرنے کے لیے intent-filter ٹیگ میں android:priority وصف استعمال کیا جاتا ہے۔ قدر جتنی زیادہ ہوگی، تنازعات حل کرتے وقت جزو کی ترجیح اتنی ہی زیادہ ہوگی۔ تاہم، ترجیح مختلف ایپلیکیشنز کے فلٹرز کے لیے کام نہیں کرتی — اس صورت میں، ہمیشہ سلیکشن ڈائیلاگ دکھایا جاتا ہے اگر کوئی ایپلیکیشن ڈیفالٹ کے طور پر متعین نہ ہو۔
ڈیولپر Intent.createChooser() کے ذریعے پروگرامائی طور پر سلیکشن ڈائیلاگ کو کال کر سکتا ہے، ہدف Intent اور ایک عنوان منتقل کر کے۔ یہ اس وقت مفید ہے جب ایپلیکیشن صارف کو واضح طور پر ایک ہینڈلر منتخب کرنے کا اختیار دینا چاہتی ہے، چاہے ڈیفالٹ ایپلیکیشن متعین ہو۔ مثال کے طور پر، ACTION_SEND کے ذریعے سوشل نیٹ ورکس پر تصاویر بھیجتے وقت createChooser کے ساتھ ڈیفالٹ سیٹنگز سے قطع نظر ڈائیلاگ دکھانے کی ضمانت دیتا ہے۔
سب سے عام غلطیوں میں سے ایک Intent Filter میں DEFAULT زمرے کی عدم موجودگی ہے۔ ڈیولپرز مثالوں سے کنفیگریشن کاپی کرتے ہیں لیکن یہ زمرہ شامل کرنا بھول جاتے ہیں، جس کے نتیجے میں Activity کو مضمر Intent موصول نہیں ہوتے۔ سسٹم مضمر کالوں کے لیے فلٹر نہیں دیکھتا، اگرچہ واضح Intent کام کرتے رہتے ہیں۔
دوسری عام غلطی مکمل URI کے بغیر data ٹیگ میں scheme کی غلط وضاحت ہے۔ اگر صرف اسکیما متعین کیا گیا ہے لیکن ہوسٹ متعین نہیں ہے، تو فلٹر کسی بھی ماخذ سے اس اسکیما والے تمام لنکس قبول کرے گا، جو ناقابل بھروسہ ذرائع سے ناپسندیدہ کالوں کا سبب بن سکتا ہے۔ کم از کم scheme اور host ہمیشہ متعین کرنے کی سفارش کی جاتی ہے۔
تیسری غلطی Activity کوڈ میں intent.data کی null چیک کی عدم موجودگی ہے۔ اگر Activity ڈیپ لنک کے ذریعے نہیں بلکہ لانچر سے معیاری طریقے سے شروع ہوتی ہے، تو Intent میں URI شامل نہیں ہوتا ہے۔ چیک کے بغیر intent.data تک رسائی NullPointerException کا سبب بنتی ہے اور ایپلیکیشن کریش ہو جاتی ہے۔ safe call آپریٹر کے ساتھ ہمیشہ intent?.data?.toString() استعمال کریں۔
اکثر پوچھے گئے سوالات
ہاں، مضمر Intent حاصل کرنے کے لیے DEFAULT زمرہ لازمی ہے۔ اس کے بغیر، سسٹم جزو کو مضمر کالیں منتقل نہیں کرے گا، اور Intent Filter صرف واضح Intent کے لیے کام کرے گا، جو ویسے بھی فلٹرز کی جانچ نہیں کرتے۔
کوئی حد نہیں ہے۔ ایک Activity میں کسی بھی تعداد میں Intent Filter ہو سکتے ہیں۔ ہر فلٹر ایک علیحدہ ہینڈلنگ منظرنامے کی وضاحت کرتا ہے، مثال کے طور پر ایک فلٹر ڈیپ لنک کے لیے، دوسرا فائل ہینڈلنگ کے لیے، تیسرا Share Sheet کے لیے۔
Intent Filter مضمر Intent کو سنبھالنے کا ایک عام طریقہ کار ہے۔ 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں