Intent Filter هو إعلان تصريحي في AndroidManifest.xml يُخبر النظام عن النوايا الضمنية التي يمكن لمكون التطبيق معالجتها. وفقًا لـ دليل مطوري Android، يحتوي الفلتر على action و category و data، وبناءً عليها يقوم النظام بتوجيه الاستدعاءات من التطبيقات الأخرى وأحداث النظام. تطوير Android يستخدم Intent Filter كآلية رئيسية للاقتران الضعيف بين مكونات التطبيقات المختلفة.
النقاط الرئيسية
Intent Filter هو عنصر تكوين في تطبيق Android يُخبر النظام عن قدرة المكون على معالجة أنواع معينة من النوايا الضمنية. على عكس Intents الصريحة التي تُحدد فئة معينة، تحتوي Intents الضمنية فقط على وصف للإجراء المطلوب، والنظام نفسه يجد المكون المناسب بناءً على الفلاتر المسجلة.
تُعلن الفلاتر داخل المكون — Activity أو Service أو BroadcastReceiver — في ملف AndroidManifest.xml. يمكن أن يحتوي كل فلتر على عناصر متعددة من action و category و data. يمكن أن يكون للمكون عدد غير محدود من Intent Filters، كل منها يصف سيناريو معالجة منفصل.
يطبق 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.
مثال على 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 — بدونها لن يقوم النظام بتمرير Intents ضمنية إلى المكون. تُضاف فئة BROWSABLE إذا كان يجب معالجة الرابط من المتصفح.
يتم إعداد الرابط العميق على Android عبر Intent Filter مع action VIEW ووسم data يحتوي على المخطط والمضيف والمسار. عند اتباع رابط مثل myapp://profile/42، يجد النظام Activity ذات الفلتر المناسب ويشغلها مع URI المُمرر. من المهم تكوين pathPrefix أو pathPattern أو path بشكل صحيح للمطابقة الدقيقة.
بدءًا من Android 6 (API 23)، تمت إضافة دعم App Links — روابط عميقة موثقة عبر 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، يجب على المطور استخراج البيانات من intent الوارد داخل المكون الهدف. لـ Activity، يُستخدم method getIntent() في onCreate()؛ لـ BroadcastReceiver، method onReceive() حيث يتم تمرير Intent كمعامل.
يتضمن استخراج البيانات الحصول على action لتحديد نوع العملية، و data لـ URI ومعاملات extra للمعلومات الإضافية. قد يكون كل من هذه العناصر غائبًا، لذلك من الضروري التحقق من null قبل الاستخدام.
مثال على معالجة رابط عميق وارد في 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)
}
}
}
يُوصى باستخدام عامل الاستدعاء الآمن للتحقق من intent و data بقيمة null، حيث قد يتم تشغيل النشاط بدون رابط عميق وارد. يجب أيضًا التحقق من host و pathSegment بقيمة null قبل استخدامهما في التنقل.
إذا سجلت تطبيقات متعددة Intent Filter يطابق نفس Intent الضمني، يعرض النظام على المستخدم مربع حوار اختيار. يمكن للمستخدم اختيار تطبيق للاستخدام لمرة واحدة أو تعيين معالج افتراضي. بدءًا من Android 10، يتم عرض مربع حوار الاختيار فقط عند الاستدعاء الأول، وبعد ذلك يتذكر النظام اختيار المستخدم.
لإدارة الأولوية، يُستخدم السمة android:priority في وسم intent-filter. كلما زادت القيمة، زادت أولوية المكون عند حل التعارضات. ومع ذلك، لا تعمل الأولوية للفلاتر من تطبيقات مختلفة — في هذه الحالة، يتم دائمًا عرض مربع حوار الاختيار إذا لم يتم تعيين أي تطبيق كافتراضي.
يمكن للمطور استدعاء مربع حوار الاختيار برمجيًا عبر Intent.createChooser()، مع تمرير Intent الهدف وعنوان. هذا مفيد عندما يريد التطبيق أن يقدم للمستخدم صراحة اختيار معالج، حتى إذا كان هناك تطبيق افتراضي مُعد. مثلاً، عند إرسال الصور إلى الشبكات الاجتماعية عبر ACTION_SEND مع createChooser يضمن عرض مربع الحوار بغض النظر عن الإعدادات الافتراضية.
أحد أكثر الأخطاء شيوعًا هو غياب الفئة DEFAULT في Intent Filter. ينسخ المطورون التكوين من الأمثلة لكنهم ينسون إضافة هذه الفئة، ونتيجة لذلك لا تتلقى Activity Intents ضمنية. النظام ببساطة لا يرى الفلتر للاستدعاءات الضمنية، على الرغم من أن Intents الصريحة تستمر في العمل.
الخطأ الثاني الشائع هو التحديد غير الصحيح لـ scheme في وسم data بدون URI كامل. إذا تم تحديد المخطط فقط ولكن لم يتم تحديد المضيف، سيقبل الفلتر جميع الروابط بهذا المخطط من أي مصدر، مما قد يؤدي إلى استدعاءات غير مرغوب فيها من مصادر غير موثوقة. يُوصى دائمًا بتحديد scheme و host على الأقل.
الخطأ الثالث هو عدم التحقق من null لـ intent.data في كود Activity. إذا تم تشغيل Activity ليس عبر رابط عميق ولكن بالطريقة القياسية من المشغل، لا يحتوي Intent على URI. الوصول إلى intent.data بدون تحقق يسبب NullPointerException وتعطل التطبيق. استخدم دائمًا intent?.data?.toString() مع عامل الاستدعاء الآمن.
الأسئلة الشائعة
نعم، الفئة DEFAULT إلزامية لتلقي Intents ضمنية. بدونها، لن يقوم النظام بتمرير الاستدعاءات الضمنية إلى المكون، وسيعمل Intent Filter فقط لـ Intents الصريحة التي لا تتحقق من الفلاتر على أي حال.
لا يوجد حد. يمكن أن تحتوي Activity واحدة على أي عدد من Intent Filters. يصف كل فلتر سيناريو معالجة منفصل، مثلاً فلتر للروابط العميقة، وآخر لمعالجة الملفات، وثالث لـ Share Sheet.
Intent Filter هو آلية عامة لمعالجة Intents الضمنية. 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 تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا