فیلتر انتناه: چیست، چگونه کار می‌کند و در توسعه استفاده می‌شود

نویسنده: IT Sectr منتشر شده: 2026-05-14 زمان مطالعه: 8 دقیقه

فیلتر انتناه (Intent Filter) یک اعلام تصریحی در AndroidManifest.xml است که به سیستم اطلاع می‌دهد کدام نیات‌های صریح را می‌تواند جزء برنامه پردازش کند. به استناد به Android Developer Guide، فیلتر شامل action، category و data است که بر اساس آن‌ها سیستم فراخوانی‌های دیگر برنامه‌ها و رویدادهای سیستم را مسیریابی می‌کند. توسعه Android از Intent Filter به عنوان مکانیسم اصلی اتصال ضعیف بین جزء برنامه‌های مختلف استفاده می‌کند.

نکات کلیدی

  • Intent Filter — اعلام XML در مانیفست که انواع Intent‌های صریح را که Activity، Service یا BroadcastReceiver می‌تواند پردازش کند مشخص می‌کند.
  • Action عملی را که جزء برنامه باید انجام دهد مشخص می‌کند — مثلاً ACTION_VIEW برای مشاهده داده‌ها یا ACTION_SEND برای ارسال محتوا.
  • Category یک دسته‌بندی اضافی برای جزء برنامه تعیین می‌کند — BROWSABLE اجازه فراخوانی از مرورگر را می‌دهد، DEFAULT برای Intent‌های صریح مورد نیاز است.
  • Data URI، نوع MIME یا الگوی داده‌های پردازش‌شده را توصیف می‌کند که برای تنظیم deep link در برنامه حیاتی است.
  • تعارض‌ها در صورت وجود چند برنامه که یک Intent را پردازش می‌کنند، توسط کادر انتخاب سیستم یا تنظیمات پیش‌فرض حل می‌شوند.

Intent Filter چیست؟

Intent Filter یک عنصر پیکربندی برنامه Android است که به سیستم اطلاع می‌دهد که یک جزء برنامه می‌تواند انواع خاصی از نیات‌های ضمنی را پردازش کند. بر خلاف Intent‌های صریح که یک کلاس مشخص را نشان می‌دهند، Intent‌های ضمنی فقط توصیف عمل مورد نیاز را شامل هستند و سیستم خود بر اساس فیلترهای ثبت‌شده جزء مناسب را پیدا می‌کند.

فیلترها داخل جزء برنامه — Activity، Service یا BroadcastReceiver — در فایل AndroidManifest.xml اعلام می‌شوند. هر فیلتر می‌تواند چندین عنصر action، category و data داشته باشد. یک جزء برنامه می‌تواند تعداد نامحدودی Intent Filter داشته باشد که هر کدام یک سناریو پردازش جداگانه را توصیف می‌کند.

نقش در معماری Android

Intent Filter اصل اتصال ضعیف را بین جزء برنامه‌ها اجرا می‌کند. برنامه A نیازی ندارد از وجود برنامه B آگاه باشد — آن فقط یک Intent با توصیف عمل ارسال می‌کند و سیستم آن را بر اساس فیلترها مسیریابی می‌کند. این مکانیسم اساس Share Sheet، انتخاب مرورگر و پردازش deep link است.

انواع Intent: صریح و ضمنی

Intent‌های صریح کلاس مشخص جزء برنامه را برای اجرا نشان می‌دهند. آن‌ها برای ناوبری داخلی در یک برنامه استفاده می‌شوند زمانی که توسعه‌دهنده دقیقاً می‌داند کدام Activity باید باز شود. Intent‌های ضمنی فقط توصیف عمل را شامل هستند و جزء برنامه توسط سیستم به صورت پویا تعیین می‌شود.

Intent Filter فقط با Intent‌های ضمنی کار می‌کند. اگر در Intent یک کلاس مشخص قرار داده شود، سیستم همه فیلترها را نادیده گرفته و جزء مشخص شده را مستقیماً اجرا می‌کند. فیلترها فقط هنگام حل و فصل فراخوانی‌های ضمنی بررسی می‌شوند که آن‌ها را به عنوان عنصر کلیدی ارتباط بین برنامه‌ها قرار می‌دهد.

مقایسه Intent‌های صریح و ضمنی

ویژگیIntent صریحIntent ضمنی
جزء برنامهبه صراحت مشخص شده (className)توسط سیستم تعیین می‌شود
Intent Filterمورد نیاز نیستاجباری است
مثالstartActivity(Intent(this, ProfileActivity::class.java))Intent(ACTION_VIEW, Uri.parse("https://example.com"))
امنیتبالاتر (بدون رهگیری)پایین‌تر (احتمال تعارض)

ساختار Intent Filter در مانیفست

هر Intent Filter از سه گروه عنصر تشکیل شده — action، category و data — که ترکیب آن‌ها مشخص می‌کند کدام Intent‌ها را جزء برنامه دریافت خواهد کرد. فیلتر اگر Intent با حداقل یک عنصر از هر گروه مطابقت داشته باشد برآورده شده تلقی می‌شود.

Action عمل انجام‌شده را توصیف می‌کند — مشاهده، ویرایش، ارسال. Category یک زمینه پردازش اضافی اضافه می‌کند — مثلاً امکان اجرا از مرورگر. Data فرمت اطلاعات پردازش‌شده را از طریق URI یا نوع MIME تعیین می‌کند.

جزئیات برچسب intent-filter

مثال Intent Filter برای Activity که لینک‌های پروفایل کاربران را باز می‌کند. فیلتر شامل هر سه گروه عنصر برای مسیریابی دقیق است.

xml
<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. پس از تأیید، سیستم به صورت خودکار برنامه را بدون کادر انتخاب باز می‌کند.

برچسب data برای URL

مثال فیلتر برای App Link با تأیید از طریق لینک HTTPS. در این حالت الگو همیشه https است و میزان مطابق با دامنه مشخص‌شده در Digital Asset Links است.

xml
<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 از روش getIntent() در onCreate() استفاده می‌شود، برای BroadcastReceiver از روش onReceive() که Intent به عنوان پارامتر ارسال می‌شود.

استخراج اطلاعات شامل دریافت action برای تعیین نوع عملیات، data برای URI و پارامترهای extra برای اطلاعات اضافی است. هر یک از این عناصر ممکن است وجود نداشته باشد، بنابراین بررسی null قبل از استفاده اجباری است.

کد پردازش در Activity

مثال پردازش deep link واردشونده در Activity به زبان Kotlin. کد URI را از Intent استخراج کرده و بر اساس میزان و مسیر تصمیم ناوبری را می‌گیرد.

kotlin
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 نمایش کادر را بدون توجه به تنظیمات پیش‌فرض تضمین می‌کند.

اشتباهات رایج در تنظیم Intent Filter

یکی از رایج‌ترین اشتباهات عدم وجود دسته 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 استفاده کنید.

سوالات متداول

آیا ذکر category DEFAULT در Intent Filter اجباری است؟

بله، برای دریافت Intent‌های ضمنی دسته DEFAULT اجباری است. بدون آن، سیستم فراخوانی‌های ضمنی را به جزء برنامه ارسال نمی‌کند و Intent Filter فقط برای Intent‌های صریح کار خواهد کرد که آن‌ها هم فیلترها را بررسی نمی‌کنند.

یک Activity چند Intent Filter می‌تواند داشته باشد؟

هیچ محدودیتی وجود ندارد. یک Activity می‌تواند هر تعداد Intent Filter داشته باشد. هر فیلتر یک سناریو پردازش جداگانه را توصیف می‌کند، مثلاً یک فیلتر برای deep link، دیگری برای پردازش فایل‌ها و سومی برای Share Sheet.

Intent Filter چه تفاوتی با App Link دارد؟

Intent Filter یک مکانیسم عمومی برای پردازش Intent‌های ضمنی است. App Link یک حالت ویژه از Intent Filter با تأیید از طریق Digital Asset Links است که به صورت خودکار برنامه را به عنوان پردازنده پیش‌فرض برای لینک‌های HTTPS در دامنه مشخص تعیین می‌کند.

آیا می‌توان از Intent Filter برای Service یا BroadcastReceiver استفاده کرد؟

بله، Intent Filter نه تنها برای Activity بلکه برای Service و BroadcastReceiver نیز قابل اعلام است. برای Service، این امکان اجرای سرویس پس‌زمینه را از برنامه‌های دیگر فراهم می‌کند، و برای BroadcastReceiver امکان دریافت پیام‌های سیستمی را فراهم می‌کند.

Intent Filter چگونه نوع‌های MIME را پردازش می‌کند؟

نوع MIME در برچسب data از طریق ویژگی‌های mimeType مشخص می‌شود. فیلتر تعیین می‌کند که جزء برنامه چه نوع داده‌هایی را می‌تواند پردازش کند — مثلاً image/* برای همه تصاویر یا text/plain فقط برای متن ساده. نوع‌های MIME می‌توانند با الگوهای URI ترکیب شوند.

خلاصه

  • Intent Filter — اعلام XML در AndroidManifest.xml که مشخص می‌کند جزء برنامه چه Intent‌های ضمنی را می‌تواند پردازش کند.
  • سه گروه — action (عمل)، category (دسته)، data (URI و MIME) فیلتر را تشکیل می‌دهند؛ جزء برنامه Intent را دریافت می‌کند اگر همه گروه‌های مشخص شده مطابقت کنند.
  • Deep link از طریق action VIEW و برچسب data با الگو، میزان و مسیر تنظیم می‌شود، به صورت اختیاری با autoVerify برای App Links.
  • App Links — لینک‌های HTTPS تأیید‌شده از طریق Digital Asset Links که نیازی به کادر انتخاب برنامه ندارند.
  • تعارض‌ها در صورت مطابقت چند فیلتر توسط کادر انتخاب سیستم یا اولویت برای جزء برنامه‌های یک برنامه حل می‌شوند.
  • پردازش Intent واردشونده از طریق intent.data در Activity یا onReceive در BroadcastReceiver با بررسی اجباری null انجام می‌شود.
  • کاربرد — Intent Filter برای ارتباط بین برنامه‌ها، پردازش لینک‌ها، فایل‌ها و رویدادهای سیستم استفاده می‌شود.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید