السلام عليكم .. متابعي مدونة مطيع الجابري .. شرحنا في الدرس السابق شرح مفهوم الـ intent بالتفصيل .
وفي هذا الدرس بشرح آلية عمل Intent Filter وهو احد الامور المرتبطة بمفهوم الـ intent وسنقوم في هذه الدرس بشرح الاتي:
1-ماهو Intent Filter وف ماذا يستخدم؟
2-كيفية اضافة Intent Filter .؟
3-شرح آلية عمل الـ Intent Filter بالتفصيل .
4-امثلة تطبيقية على كيفية استخدام Intent Filter وآلية عمله.
هنا سيكون الناتج من هذا الدرس:
1-ماهو Intent Filter؟
عندما نقوم بانشاء Implicit Intent وتحديد مكوناته(action/data ..etc ) فانه لابد من التعامل Intent Filter
الذي يقوم بتحديد الكائن الذي بامكانه استقبال Implicit Intent الذ ي قمنا بانشائه .
كمثال :
-عندما نريد إرسال بريد الكتروني فإننا نقوم بإنشاء Implicit Intent ثم يتم إرسال هذا الـ intent ثم يقوم الـ Intent Filter باستقبال هذا الـ Intent وتحديد الكائنات(activity/service/Broadcast Receiver) التي بامكانها استقبال هذا الـ intent وإرسال البريد الكتروني.
وتوجد لـ intent Filter استخدمات سنذكر بعضها:-
1-تحديد الـ Intent للمكونات(activity/service/BroadcastReceiver ) .
2-تحديد الـ action للـ intent الخاص بهذا الكائن.
3-تحديد الـ data للـ intent الخاص بهذا الكائن.
4-تحديد الـ category للـ intent الخاص بهذا الكائن.
يمكن تلخيص فيما سبق في الاتي:
"Intent Filter يستخدم في تحديد الـ intent الذي بمكانها التعامل هذا المكون (Activity/Service/BroadvastReceiver)"
2-كيفية إضافة وتحديد الـ intent Filter ؟
بعد ان عرفنا الغرض من استخدام intent filter سنتعرف الان على كيفية اضافة intent filter.
-يتم اضافة intent filter في ملف manifest.xml من خلال الوسم <intent-filter>.
-يتم اضافة وسوم خصائص ومكونات الـ intent filter بداخل الوسم <intent-filter> وهي كمايلي:
1-الوسم <action> : لتحديد الـ action الخاص بهذه الـ intent.
2-الوسم <category>: لتحديد الفئة الخاصة بهذا الـ intent.
والان نقوم باضافة intent-filter وذلك عبر الخطوات التالية:
1-نذهب إلى ملف manifest.xml.
2-نذهب إلى الوسم الخاص بالكائن الذي نريد تحديد الـ intent filter له كمثال:
-الوسم <activity > :وهو الوسم الخاص الواجهات.
-الوسم <service> : وهو الوسم الخاص بالخدمات.
-الوسم <receiver >: وهو الوسم الخاص بالـ BroadcastReceiver .
3-نقوم باضافة الوسم <intent-filter> إلى الكائن الذ ي نريد اضافة Intenbt-filter له.
4- نقوم باضافة الوسم <action> و <category> داخل الوسم <intent-filter>.
5- نستخدم الخاصية ""=android:name لاعطاء قيمة للـ action والـ category كما في الكود ادناه:
4- نقوم باضافة الوسم <action> و <category> داخل الوسم <intent-filter>.
5- نستخدم الخاصية ""=android:name لاعطاء قيمة للـ action والـ category كما في الكود ادناه:
1 2 3 4 5 6 7 8 9 | <activity android:name="com.example.intentfilter.ActivityC" android:label="@string/title_activity_activity_c" > <intent-filter> <action android:name="MyAction" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="MY_CATEGORY"/> </intent-filter> </activity> |
نلاحظ من الكود اعلاه الاتي:
1-السطر 4:تمت إضافة Intent filter إلى activity .
2-السطر 5:تمت اضافة action واعطائه القيمة "MyAction" .
3-السطر 6: تمت اضافة category واعطائها القيمة android.intent.category.DEFAULT وهي فئة موجودة ضمن النظام.
4-السطر 7: اضافة category اخرى واعطائها القيمة "MY-CATEGORY".
*ملاحظات:
1-يمكن إن يكون للمكون الواحد أكثر من intent filter .
2-كل مكون يمكن أن
يحتوي على أكثر من intent Filter .
3-عند إنشاء Implicit intent يجب تعريف action واحد على الأقل.
4-عند إضافة الفئة Deafult إلى intent filter هذا يعني إنه سيتم
الانتقال لهذا المكون بواسطة implicit intent.
5-يفضل تسمية الـ action أو category بأسلوب أسماء الحزم كمثال:com.muteealjabr.TEST
3-كيف يعمل Intent Filter
يمكن اختصار شرح آلية عمل Intent Filter في العبارة الاتية:
"يستقبل intent ومن ثم تحديد المكون المستقبل لهذا الـ Intent"
وتوضح الصورة ادناه آلية عمل Intent Filter بالتفصيل:
والان نقوم بشرح آلية عمل Intent Filter بالتفصيل كما في الصورة:
1-A:Source Compenet :الكائن المصدر :
وهو المكون الذي سيتم إرسال intent منه ولنفرض انه activity .
2-تم إرسال intent من الكائن A .
3-Intent Object : وهالـ intent الذي قمنا بارساله من المكون A ويحتوي
على action و category و data.
4- تم إرسال intent من المكون A إلى Intent Filter .
5- Intent Filter :يقوم intent Filter باستقبال هذا الـ Intent ومن ثم يقوم بمقارنة action,category , data مع الكائن الذي سيستقبل هذا الـ intent ففي حالة تتطابق جميع الـ action ,category , data مع الكائن الهدف سيتم الانتقال إلى هذا الكائن.
6-Target Compenet: وهو المكون الهدف الذي سيقوم باستقبال هذا الـ intent.
4-امثلة تطبيقية على كيفية استخدام Intent Filter وآلية عمله.
الان سنزضح بعض الامثله حول آلية عمل Intent Filter.
1-نذهب إلى اندرويد استديو ونقوم بانشاء مشروع جديد نسميه IntentFiltrerTest.
2-نقوم باضافه 3 واجهات activities إلى المشروع كمايلي:
-ActivityA.
-ActivityB.
-ActivityC.
3-نذهب إلى ملف activity_main.xml ونضيف زر كما يلي:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.blogspot.muteealjabri.intentfiltertest.MainActivity"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentLeft="true" android:text="testIntentFilter" android:onClick="test" android:layout_centerVertical="true"/> </RelativeLayout> |
4-نذهب إلى ملف manifest.xml ونقوم بإضافة intent-filter إلى الواجهات activities كمايلي:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.blogspot.muteealjabri.intentfiltertest"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ActivityA" > <intent-filter> <action android:name="com.blogspot.muteealjabri.TEST" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name=".ActivityB" android:label="Activity B"> <intent-filter> <action android:name="com.blogspot.muteealjabri.TEST" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name=".ActivityC"> <intent-filter> <action android:name="com.blogspot.muteealjabri.TEST" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application> </manifest> |
نلاحظ من اكود أعلاه:
-انه تم إضافة action
<action android:name="com.muteealjabri.TEST"/>
إلى جميع الواجهات ActivityA , ActivityB , ActivityC .
5-نذهب إلى ملف MainActivty.Java ونضيف دالة حدث الضغط على الزر testIntentFilterونكتب الكود بداخلها:
1 2 3 4 | public void test(View v){ Intent i = new Intent("com.blogspot.muteealjabri.TEST"); startActivity(i); } |
تأتي الان لشرح الكود:
السطر 2: إنشاء اوبجكت من الكلاس intent يحتوي على action وهو "com.blogspot.muteealjabri.TEST "
السطر 3:عرض جميع الشاشات إلى تحتوي على action من نوع "com.blogspot.muteealjabri.TEST "
ويمكن تلخيص عمل الكود أعلاه بالصورة الاتية:
1-إرسال intent من MainActivity.
2-الـ intent الذي قمن بارساله يحتوي على action .
3-تتم مطابقة الـ intent المرسل مع intent Filter للكائنات .
4-في حالة التطابق يتم عرض جميع المكونات التي بإمكانها استقبال هذا الـ intent كما في الصورة ادناه:
مثال آخر :
سنقوم الان بإضافة category إلى intent filter الخاص بالواجهتين activityB,ActivityC كما في الكود ادناه:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <activity android:name=".ActivityB" android:label="Activity B"> <intent-filter> <action android:name="com.blogspot.muteealjabri.TEST" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="com.blogspot.muteealjabri.MY_CATEGORY" /> </intent-filter> </activity> <activity android:name=".ActivityC"> <intent-filter> <action android:name="com.blogspot.muteealjabri.TEST" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="com.blogspot.muteealjabri.MY_CATEGORY" /> </intent-filter> </activity> |
من الكود أعلاه تمت إضافة category لكل من ActivityB,ActivityC.
بعد ذلك نقوم بالاتي:
1-نذهب إلى ملف MainActivty.Java ونضيف دالة حدث الضغط على الزر testIntentFilterونكتب الكود بداخلها:
1 2 3 4 5 | public void test(View v){ Intent i= new Intent("com.blogspot.muteealjabri.TEST"); i.addCategory("com.blogspot.muteealjabri.MY_CATEGORY"); startActivity(i); } |
ناتي إلى شرح الكود:
السطر 2: إنشاء اوبجكت من الكلاس intent يحتوي على action وهو "com.blogspot.muteealjabri.TEST "
السطر 3: إضافة category إلى intent وذلك باستخدام الدالة addCategory ومن ثم تمرير الـ category لها بصيغة نصية string.
السطر 4:عرض جميع الشاشات إلى تحتوي على action من نوع "com.muteealjabri.MY_CATEGORY "
ويمكن تلخيص عمل الكود أعلاه بالصورة الاتية:
1-إرسال intent من MainActivity.
2-الـ intent الذي قمنا بإرساله يحتوي على action و category.
3-تتم مطابقة الـ intent المرسل مع intent Filter للكائنات .
4-في حالة التطابق يتم عرض جميع المكونات التي بإمكانها استقبال هذا الـ intent.
5-نلاحظ انه تم التطابق مع activityB و activtyC ولم يتطابق مع Activity Aلذلك عند الضغط على الزر يتم عرض مربع حوار يحتوي على المكونات التي بإمكانها استقبال هذا الـ Intent كما في الصورة ادناه:
هنا الكود الكامل للدرس:
هنا الكود الكامل للدرس:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | package com.blogspot.muteealjabri.intentfiltertest; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void test(View view){ Intent i = new Intent("com.blogspot.muteealjabri.TEST"); i.addCategory("com.blogspot.muteealjabri.MY_CATEGORY"); startActivity(i); } } |
وصلنا إلى نهاية الدرس .. يرجى الاشتراك بقناتنا على اليوتيوب. ورأيكم يهمني بالتعليقات