فیلتر انتناه (Intent Filter) یک اعلام تصریحی در AndroidManifest.xml است که به سیستم اطلاع میدهد کدام نیاتهای صریح را میتواند جزء برنامه پردازش کند. به استناد به Android Developer Guide، فیلتر شامل action، category و data است که بر اساس آنها سیستم فراخوانیهای دیگر برنامهها و رویدادهای سیستم را مسیریابی میکند. توسعه Android از Intent Filter به عنوان مکانیسم اصلی اتصال ضعیف بین جزء برنامههای مختلف استفاده میکند.
نکات کلیدی
Intent Filter یک عنصر پیکربندی برنامه Android است که به سیستم اطلاع میدهد که یک جزء برنامه میتواند انواع خاصی از نیاتهای ضمنی را پردازش کند. بر خلاف Intentهای صریح که یک کلاس مشخص را نشان میدهند، Intentهای ضمنی فقط توصیف عمل مورد نیاز را شامل هستند و سیستم خود بر اساس فیلترهای ثبتشده جزء مناسب را پیدا میکند.
فیلترها داخل جزء برنامه — Activity، Service یا BroadcastReceiver — در فایل AndroidManifest.xml اعلام میشوند. هر فیلتر میتواند چندین عنصر action، category و data داشته باشد. یک جزء برنامه میتواند تعداد نامحدودی Intent Filter داشته باشد که هر کدام یک سناریو پردازش جداگانه را توصیف میکند.
Intent Filter اصل اتصال ضعیف را بین جزء برنامهها اجرا میکند. برنامه A نیازی ندارد از وجود برنامه B آگاه باشد — آن فقط یک Intent با توصیف عمل ارسال میکند و سیستم آن را بر اساس فیلترها مسیریابی میکند. این مکانیسم اساس Share Sheet، انتخاب مرورگر و پردازش deep link است.
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 تعیین میکند.
مثال Intent Filter برای Activity که لینکهای پروفایل کاربران را باز میکند. فیلتر شامل هر سه گروه عنصر برای مسیریابی دقیق است.
<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 اگر لینک باید از مرورگر پردازش شود اضافه میشود.
Deep link در Android از طریق Intent Filter با action VIEW و برچسب data شامل الگو، میزان و مسیر تنظیم میشود. با کلیک روی لینکی به صورت myapp://profile/42، سیستم Activity با فیلتر مناسب را پیدا کرده و آن را با URI ارسالی اجرا میکند. تنظیم درست pathPrefix، pathPattern یا path برای مطابقت دقیق اهم است.
از Android 6 (API 23) به بعد، پشتیبانی از App Links اضافه شد که deep linkهای تأییدشده از طریق HTTPS هستند. برای App Links از همان Intent Filter استفاده میشود اما با تأیید اضافی دامنه از طریق Digital Asset Links. پس از تأیید، سیستم به صورت خودکار برنامه را بدون کادر انتخاب باز میکند.
مثال فیلتر برای App Link با تأیید از طریق لینک HTTPS. در این حالت الگو همیشه 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 انتخاب کرد، توسعهدهنده باید اطلاعات را از نیت واردشونده در داخل جزء هدف استخراج کند. برای Activity از روش getIntent() در onCreate() استفاده میشود، برای BroadcastReceiver از روش onReceive() که Intent به عنوان پارامتر ارسال میشود.
استخراج اطلاعات شامل دریافت action برای تعیین نوع عملیات، data برای URI و پارامترهای extra برای اطلاعات اضافی است. هر یک از این عناصر ممکن است وجود نداشته باشد، بنابراین بررسی null قبل از استفاده اجباری است.
مثال پردازش deep link واردشونده در Activity به زبان Kotlin. کد URI را از Intent استخراج کرده و بر اساس میزان و مسیر تصمیم ناوبری را میگیرد.
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)
}
}
}
توصیه میشود از safe call operator برای بررسی intent و data برای null استفاده کنید، زیرا فعالیت ممکن است بدون deep link واردشونده اجرا شود. همچنین باید host و pathSegment را قبل از استفاده در ناوبری برای null بررسی کنید.
اگر چند برنامه Intent Filter مناسب برای همان Intent ضمنی ثبت کرده باشند، سیستم یک کادر انتخاب به کاربر نشان میدهد. کاربر میتواند برنامه را برای استفاده یکباره انتخاب کند یا یک پردازنده پیشفرض تنظیم کند. از Android 10، کادر انتخاب فقط در فراخوانی اول نشان داده میشود و پس از آن سیستم انتخاب کاربر را به خاطر میسپارد.
برای مدیریت اولویت از ویژگی android:priority در برچسب intent-filter استفاده میشود. هر چه مقدار بالاتر باشد، اولویت جزء برنامه در حل تعارض بیشتر است. اما اولویت برای فیلترهای برنامههای مختلف کار نمیکند — در این حالت اگر هیچ برنامهای به عنوان پیشفرض تنظیم نشده باشد، همیشه کادر انتخاب نشان داده میشود.
توسعهدهنده میتواند از طریق Intent.createChooser() به صورت برنامهای کادر انتخاب را فراخوان کند، Intent هدف و عنوان را ارسال کند. این زمانی مفید است که برنامه بخواهد به صورت صریح انتخاب پردازنده را به کاربر پیشنهاد کند، حتی اگر برنامه پیشفرض تنظیم شده باشد. به عنوان مثال، هنگام ارسال تصاویر به شبکههای اجتماعی از طریق ACTION_SEND با createChooser نمایش کادر را بدون توجه به تنظیمات پیشفرض تضمین میکند.
یکی از رایجترین اشتباهات عدم وجود دسته DEFAULT در Intent Filter است. توسعهدهندگان تنظیمات را از نمونهها کپی میکنند اما اضافه کردن این دسته را فراموش میکنند، در نتیجه Activity Intentهای ضمنی را دریافت نمیکند. سیستم صرفاً فیلتر را برای فراخوانیهای ضمنی نمیبیند، هر چند Intentهای صریح به کار خود ادامه میدهند.
دومین اشتباه رایج تعیین نادرست scheme در برچسب data بدون URI کامل است. اگر فقط الگو مشخص شود اما host مشخص نشود، فیلتر همه لینکها را با آن الگو از هر منبعی قبول خواهد کرد که میتواند منجر به فراخوانیهای نامطلوب از منابع تأییدنشده شود. توصیه میشود همیشه حداقل scheme و host را مشخص کنید.
سومین اشتباه عدم بررسی intent.data برای null در کد Activity است. اگر Activity از طریق deep link وارد نشود بلکه به صورت استاندارد از لانچر اجرا شود، Intent شامل URI نیست. دسترسی به intent.data بدون بررسی باعث NullPointerException و کراش برنامه میشود. همیشه از intent?.data?.toString() با اپراتور safe call استفاده کنید.
سوالات متداول
بله، برای دریافت Intentهای ضمنی دسته DEFAULT اجباری است. بدون آن، سیستم فراخوانیهای ضمنی را به جزء برنامه ارسال نمیکند و Intent Filter فقط برای Intentهای صریح کار خواهد کرد که آنها هم فیلترها را بررسی نمیکنند.
هیچ محدودیتی وجود ندارد. یک Activity میتواند هر تعداد Intent Filter داشته باشد. هر فیلتر یک سناریو پردازش جداگانه را توصیف میکند، مثلاً یک فیلتر برای deep link، دیگری برای پردازش فایلها و سومی برای Share Sheet.
Intent Filter یک مکانیسم عمومی برای پردازش Intentهای ضمنی است. App Link یک حالت ویژه از Intent Filter با تأیید از طریق Digital Asset Links است که به صورت خودکار برنامه را به عنوان پردازنده پیشفرض برای لینکهای HTTPS در دامنه مشخص تعیین میکند.
بله، Intent Filter نه تنها برای Activity بلکه برای Service و BroadcastReceiver نیز قابل اعلام است. برای Service، این امکان اجرای سرویس پسزمینه را از برنامههای دیگر فراهم میکند، و برای BroadcastReceiver امکان دریافت پیامهای سیستمی را فراهم میکند.
نوع MIME در برچسب data از طریق ویژگیهای mimeType مشخص میشود. فیلتر تعیین میکند که جزء برنامه چه نوع دادههایی را میتواند پردازش کند — مثلاً image/* برای همه تصاویر یا text/plain فقط برای متن ساده. نوعهای MIME میتوانند با الگوهای URI ترکیب شوند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید